@intent-systems/nexus 2026.1.5-4 → 2026.1.5-8
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/dist/agents/agent-id.js +41 -0
- package/dist/agents/auth-profiles.js +114 -25
- package/dist/agents/identity-state.js +101 -0
- package/dist/agents/model-auth.js +1 -0
- package/dist/agents/model-fallback.js +15 -9
- package/dist/agents/model-selection.js +1 -1
- package/dist/agents/models-config.js +17 -11
- package/dist/agents/pi-embedded-runner.js +101 -9
- package/dist/agents/sandbox.js +12 -3
- package/dist/agents/skill-runner.js +41 -6
- package/dist/agents/skill-usage.js +117 -17
- package/dist/agents/skills-status.js +4 -3
- package/dist/agents/skills.js +38 -30
- package/dist/agents/subagent-registry.js +25 -11
- package/dist/agents/system-prompt.js +16 -0
- package/dist/agents/tool-policy.js +19 -3
- package/dist/agents/tools/browser-tool.js +5 -2
- package/dist/agents/tools/image-tool.js +93 -8
- package/dist/agents/tools/sessions-announce-target.js +5 -1
- package/dist/agents/workspace.js +81 -59
- package/dist/auto-reply/command-detection.js +2 -1
- package/dist/auto-reply/reply/directive-handling.js +153 -28
- package/dist/auto-reply/reply/directives.js +17 -2
- package/dist/auto-reply/reply/model-selection.js +8 -3
- package/dist/auto-reply/reply/queue.js +2 -2
- package/dist/auto-reply/reply.js +1 -1
- package/dist/auto-reply/thinking.js +15 -0
- package/dist/browser/chrome.js +1 -1
- package/dist/browser/client.js +2 -0
- package/dist/browser/config.js +6 -2
- package/dist/browser/pw-tools-core.js +3 -0
- package/dist/browser/routes/agent.js +14 -0
- package/dist/canvas-host/server.js +1 -1
- package/dist/capabilities/detector.js +46 -15
- package/dist/capabilities/registry.js +2 -1
- package/dist/cli/cloud-cli.js +70 -7
- package/dist/cli/credential-cli.js +214 -23
- package/dist/cli/gateway-cli.js +1 -1
- package/dist/cli/log-cli.js +25 -0
- package/dist/cli/pairing-cli.js +1 -1
- package/dist/cli/program.js +82 -8
- package/dist/cli/run-main.js +1 -1
- package/dist/cli/skills-cli.js +165 -30
- package/dist/cli/skills-hub-cli.js +68 -36
- package/dist/cli/tool-connector-cli.js +99 -24
- package/dist/cli/upstream-sync-cli.js +253 -96
- package/dist/cli/usage-cli.js +14 -0
- package/dist/commands/auth-choice-options.js +6 -1
- package/dist/commands/auth-choice.js +157 -5
- package/dist/commands/bootstrap-preset.js +26 -12
- package/dist/commands/capabilities.js +33 -6
- package/dist/commands/claude-md.js +3 -2
- package/dist/commands/config-view.js +1 -1
- package/dist/commands/config.js +85 -0
- package/dist/commands/configure.js +4 -4
- package/dist/commands/credential.js +497 -36
- package/dist/commands/cursor-hooks.js +240 -0
- package/dist/commands/cursor-rules.js +14 -188
- package/dist/commands/doctor.js +5 -4
- package/dist/commands/identity.js +29 -32
- package/dist/commands/init.js +304 -20
- package/dist/commands/log.js +134 -0
- package/dist/commands/models/fallbacks.js +1 -1
- package/dist/commands/models/image-fallbacks.js +1 -1
- package/dist/commands/models/list.js +1 -1
- package/dist/commands/models/scan.js +1 -1
- package/dist/commands/onboard-auth.js +27 -2
- package/dist/commands/onboard-eve-identity.js +8 -9
- package/dist/commands/onboard-non-interactive.js +4 -2
- package/dist/commands/onboard-quickstart.js +18 -11
- package/dist/commands/quest-state.js +271 -0
- package/dist/commands/quest.js +53 -13
- package/dist/commands/reset.js +1 -1
- package/dist/commands/sessions-ingest.js +5 -4
- package/dist/commands/setup.js +4 -2
- package/dist/commands/skills-manifest.js +89 -29
- package/dist/commands/status.js +193 -73
- package/dist/commands/suggestions.js +1 -1
- package/dist/commands/usage-tracking.js +32 -0
- package/dist/commands/usage-upload.js +6 -1
- package/dist/config/defaults.js +1 -3
- package/dist/config/includes.js +5 -7
- package/dist/config/io.js +88 -16
- package/dist/config/legacy.js +4 -2
- package/dist/config/paths.js +16 -0
- package/dist/config/sessions.js +9 -5
- package/dist/config/zod-schema.js +4 -3
- package/dist/control-plane/broker/broker.js +131 -78
- package/dist/control-plane/compaction.js +3 -5
- package/dist/control-plane/factory.js +2 -2
- package/dist/control-plane/index.js +2 -2
- package/dist/control-plane/odu/agents.js +28 -23
- package/dist/control-plane/odu/interaction-tools.js +62 -50
- package/dist/control-plane/odu/prompt-loader.js +8 -8
- package/dist/control-plane/odu/runtime.js +87 -75
- package/dist/control-plane/odu-control-plane.js +14 -12
- package/dist/control-plane/single-agent.js +13 -13
- package/dist/credentials/store.js +133 -7
- package/dist/daemon/launchd.js +14 -0
- package/dist/entry.js +0 -0
- package/dist/gateway/server-browser.js +5 -4
- package/dist/gateway/server-methods/cron.js +11 -1
- package/dist/gateway/server.js +14 -7
- package/dist/infra/bonjour.js +1 -1
- package/dist/infra/event-log.js +8 -2
- package/dist/infra/path-env.js +1 -2
- package/dist/infra/provider-usage.auth.js +5 -3
- package/dist/infra/provider-usage.fetch.claude.js +16 -6
- package/dist/infra/provider-usage.fetch.minimax.js +8 -3
- package/dist/infra/provider-usage.js +9 -5
- package/dist/infra/restart.js +2 -2
- package/dist/infra/usage-settings.js +78 -0
- package/dist/infra/usage-suggestions.js +17 -5
- package/dist/infra/usage-upload.js +38 -1
- package/dist/infra/voicewake.js +2 -2
- package/dist/media/image-ops.js +3 -1
- package/dist/memory/index.js +2 -381
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
- package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
- package/dist/pairing/pairing-store.js +24 -0
- package/dist/providers/github-copilot-auth.js +1 -1
- package/dist/routing/resolve-route.js +6 -6
- package/dist/routing/session-key.js +3 -1
- package/dist/sessions/send-policy.js +5 -5
- package/dist/slack/monitor.js +22 -1
- package/dist/telegram/reaction-level.js +2 -1
- package/dist/utils.js +8 -3
- package/dist/wizard/onboarding.js +29 -7
- package/docs/AGENTS.default.md +1 -1
- package/docs/configuration.md +1 -1
- package/docs/feature-inventory/overview.md +2 -2
- package/docs/reference/templates/AGENTS.md +172 -109
- package/docs/templates/AGENTS.md +140 -199
- package/docs/templates/BOOTSTRAP.md +40 -20
- package/docs/templates/IDENTITY.md +6 -0
- package/docs/templates/USER.md +22 -2
- package/package.json +3 -1
- package/skills/{notion → connectors/notion}/SKILL.md +1 -1
- package/skills/{filesystem → guides/filesystem}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/SKILL.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/CAPABILITY_TAXONOMY.md +5 -5
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR.md +8 -8
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_ONBOARDING.md +2 -2
- package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_SKILLS.md +26 -20
- package/skills/{onboarding → guides/onboarding}/docs/GOAL_STATE_ARCHITECTURE.md +38 -43
- package/skills/{onboarding → guides/onboarding}/docs/NEXUS_SYSTEM_OVERVIEW.md +4 -4
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_HUB_SPEC.md +1 -1
- package/skills/{onboarding → guides/onboarding}/docs/SKILLS_SPECIFICATION.md +8 -7
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_DESIGN.md +16 -16
- package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_PRD.md +10 -12
- package/skills/guides/onboarding/docs/canonical/00_CONFLICT_ANALYSIS.md +463 -0
- package/skills/guides/onboarding/docs/canonical/01_NEXUS_OVERVIEW.md +167 -0
- package/skills/guides/onboarding/docs/canonical/02_CLI_REFERENCE.md +404 -0
- package/skills/guides/onboarding/docs/canonical/03_STATE_ARCHITECTURE.md +357 -0
- package/skills/guides/onboarding/docs/canonical/04_SKILL_SPECIFICATION.md +393 -0
- package/skills/guides/onboarding/docs/canonical/05_CAPABILITY_TAXONOMY.md +298 -0
- package/skills/guides/onboarding/docs/canonical/06_CAPABILITIES_REFERENCE.md +207 -0
- package/skills/guides/onboarding/docs/canonical/07_AGENT_BINDINGS.md +85 -0
- package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/nexus-cloud.md +2 -2
- package/skills/{onboarding → guides/onboarding}/scripts/ralph/progress.txt +1 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/SKILL.md +2 -1
- package/skills/{nexus-cloud → tools/nexus-cloud}/docs/setup.md +1 -1
- package/docs/templates/PROFILE.md +0 -14
- /package/skills/{brave-search → connectors/brave-search}/SKILL.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/setup.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/troubleshooting.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/docs/usage.md +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/content.mjs +0 -0
- /package/skills/{brave-search → connectors/brave-search}/scripts/search.mjs +0 -0
- /package/skills/{discord → connectors/discord}/SKILL.md +0 -0
- /package/skills/{gemini → connectors/gemini}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/SKILL.md +0 -0
- /package/skills/{github → connectors/github}/docs/setup.md +0 -0
- /package/skills/{github → connectors/github}/docs/troubleshooting.md +0 -0
- /package/skills/{google-oauth → connectors/google-oauth}/SKILL.md +0 -0
- /package/skills/{slack → connectors/slack}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/SKILL.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/pairing.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/setup.md +0 -0
- /package/skills/{telegram → connectors/telegram}/docs/webhook.md +0 -0
- /package/skills/{wacli → connectors/wacli}/SKILL.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/auth.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/backup.md +0 -0
- /package/skills/{wacli → connectors/wacli}/docs/troubleshooting.md +0 -0
- /package/skills/{browser-use-agent-sdk → guides/browser-use-agent-sdk}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/SKILL.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/components/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/App.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/data/nexus-core.json +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/index.css +0 -0
- /package/skills/{json-render → guides/json-render}/assets/demo/registry.tsx +0 -0
- /package/skills/{json-render → guides/json-render}/docs/nexus-state-demo.md +0 -0
- /package/skills/{json-render → guides/json-render}/docs/shadcn-preset.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/create-vite-demo.sh +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/README.md +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/catalog.ts +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package-lock.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/package.json +0 -0
- /package/skills/{json-render → guides/json-render}/scripts/llm-server/server.ts +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CAPABILITIES.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_CREDENTIALS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/DOCUMENTATION_OVERVIEW.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/ENTITY_MODEL.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/SKILL_INVENTORY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/STATE_ARCHITECTURE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/TROUBLESHOOTING.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/USER_JOURNEY.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/WOW_MOMENTS.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/agent-apple-id.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/1password.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/TEMPLATE.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/aix.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/bird.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/brave-search.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/comms.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/computer-use.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/cron-and-heartbeat.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/eve.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/github.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/gog.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/homebrew-prereqs.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/qmd.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/telegram.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/wacli.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/weather.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prd.json +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prompt.md +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.log +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.sh +0 -0
- /package/skills/{onboarding → guides/onboarding}/scripts/setup-cursor-skills.sh +0 -0
- /package/skills/{1password → tools/1password}/SKILL.md +0 -0
- /package/skills/{1password → tools/1password}/docs/setup.md +0 -0
- /package/skills/{1password → tools/1password}/docs/troubleshooting.md +0 -0
- /package/skills/{1password → tools/1password}/references/cli-examples.md +0 -0
- /package/skills/{1password → tools/1password}/references/get-started.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/SKILL.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/browser-use-eval.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/first-tests.md +0 -0
- /package/skills/{agent-browser → tools/agent-browser}/docs/wordle-nyt-eval.js +0 -0
- /package/skills/{aix → tools/aix}/SKILL.md +0 -0
- /package/skills/{aix → tools/aix}/docs/embeddings.md +0 -0
- /package/skills/{aix → tools/aix}/docs/setup.md +0 -0
- /package/skills/{aix → tools/aix}/docs/troubleshooting.md +0 -0
- /package/skills/{aix → tools/aix}/references/sql.md +0 -0
- /package/skills/{apple-notes → tools/apple-notes}/SKILL.md +0 -0
- /package/skills/{apple-reminders → tools/apple-reminders}/SKILL.md +0 -0
- /package/skills/{bear-notes → tools/bear-notes}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/SKILL.md +0 -0
- /package/skills/{bird → tools/bird}/docs/auth.md +0 -0
- /package/skills/{bird → tools/bird}/docs/troubleshooting.md +0 -0
- /package/skills/{blogwatcher → tools/blogwatcher}/SKILL.md +0 -0
- /package/skills/{blucli → tools/blucli}/SKILL.md +0 -0
- /package/skills/{camsnap → tools/camsnap}/SKILL.md +0 -0
- /package/skills/{clawdhub → tools/clawdhub}/SKILL.md +0 -0
- /package/skills/{coding-agent → tools/coding-agent}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/SKILL.md +0 -0
- /package/skills/{comms → tools/comms}/docs/adapters.md +0 -0
- /package/skills/{comms → tools/comms}/docs/setup.md +0 -0
- /package/skills/{comms → tools/comms}/docs/troubleshooting.md +0 -0
- /package/skills/{comms → tools/comms}/references/schema.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/SKILL.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/open-interpreter.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/peekaboo.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/setup.md +0 -0
- /package/skills/{computer-use → tools/computer-use}/docs/troubleshooting.md +0 -0
- /package/skills/{eightctl → tools/eightctl}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/SKILL.md +0 -0
- /package/skills/{eve → tools/eve}/docs/dual-account.md +0 -0
- /package/skills/{eve → tools/eve}/docs/intelligence.md +0 -0
- /package/skills/{eve → tools/eve}/docs/setup.md +0 -0
- /package/skills/{eve → tools/eve}/docs/troubleshooting.md +0 -0
- /package/skills/{eve → tools/eve}/scripts/setup-dual-account.sh +0 -0
- /package/skills/{food-order → tools/food-order}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/SKILL.md +0 -0
- /package/skills/{gh → tools/gh}/docs/usage.md +0 -0
- /package/skills/{gifgrep → tools/gifgrep}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/SKILL.md +0 -0
- /package/skills/{gog → tools/gog}/docs/portability.md +0 -0
- /package/skills/{gog → tools/gog}/docs/setup.md +0 -0
- /package/skills/{gog → tools/gog}/docs/troubleshooting.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/README.md +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/add_test_users.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts_manual.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/create_oauth_client.py +0 -0
- /package/skills/{gog → tools/gog}/scripts/cdp/launch_cdp_chrome.sh +0 -0
- /package/skills/{goplaces → tools/goplaces}/SKILL.md +0 -0
- /package/skills/{imsg → tools/imsg}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/SERVER_README.md +0 -0
- /package/skills/{local-places → tools/local-places}/SKILL.md +0 -0
- /package/skills/{local-places → tools/local-places}/pyproject.toml +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__init__.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/google_places.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/main.py +0 -0
- /package/skills/{local-places → tools/local-places}/src/local_places/schemas.py +0 -0
- /package/skills/{mcporter → tools/mcporter}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/SKILL.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/references/codexbar-cli.md +0 -0
- /package/skills/{model-usage → tools/model-usage}/scripts/model_usage.py +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/SKILL.md +0 -0
- /package/skills/{nano-banana-pro → tools/nano-banana-pro}/scripts/generate_image.py +0 -0
- /package/skills/{nano-pdf → tools/nano-pdf}/SKILL.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/security.md +0 -0
- /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/troubleshooting.md +0 -0
- /package/skills/{obsidian → tools/obsidian}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/SKILL.md +0 -0
- /package/skills/{openai-image-gen → tools/openai-image-gen}/scripts/gen.py +0 -0
- /package/skills/{openai-whisper → tools/openai-whisper}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/SKILL.md +0 -0
- /package/skills/{openai-whisper-api → tools/openai-whisper-api}/scripts/transcribe.sh +0 -0
- /package/skills/{openhue → tools/openhue}/SKILL.md +0 -0
- /package/skills/{oracle → tools/oracle}/SKILL.md +0 -0
- /package/skills/{ordercli → tools/ordercli}/SKILL.md +0 -0
- /package/skills/{peekaboo → tools/peekaboo}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/SKILL.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/mcp.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/ollama.md +0 -0
- /package/skills/{qmd → tools/qmd}/docs/setup.md +0 -0
- /package/skills/{sag → tools/sag}/SKILL.md +0 -0
- /package/skills/{skill-cli-template → tools/skill-cli-template}/SKILL.md +0 -0
- /package/skills/{songsee → tools/songsee}/SKILL.md +0 -0
- /package/skills/{sonoscli → tools/sonoscli}/SKILL.md +0 -0
- /package/skills/{spotify-player → tools/spotify-player}/SKILL.md +0 -0
- /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
- /package/skills/{things-mac → tools/things-mac}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/SKILL.md +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/find-sessions.sh +0 -0
- /package/skills/{tmux → tools/tmux}/scripts/wait-for-text.sh +0 -0
- /package/skills/{trello → tools/trello}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/SKILL.md +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/auto-port.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-all.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-nexus.sh +0 -0
- /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-pi-ai.sh +0 -0
- /package/skills/{video-frames → tools/video-frames}/SKILL.md +0 -0
- /package/skills/{video-frames → tools/video-frames}/scripts/frame.sh +0 -0
- /package/skills/{weather → tools/weather}/SKILL.md +0 -0
- /package/skills/{weather → tools/weather}/docs/usage.md +0 -0
package/dist/cli/usage-cli.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { usageTrackingCommand } from "../commands/usage-tracking.js";
|
|
1
2
|
import { usageUploadCommand } from "../commands/usage-upload.js";
|
|
2
3
|
import { defaultRuntime } from "../runtime.js";
|
|
3
4
|
export function registerUsageCli(program) {
|
|
@@ -21,4 +22,17 @@ export function registerUsageCli(program) {
|
|
|
21
22
|
onlyFlush: Boolean(opts.onlyFlush),
|
|
22
23
|
}, defaultRuntime);
|
|
23
24
|
});
|
|
25
|
+
usageCmd
|
|
26
|
+
.command("tracking")
|
|
27
|
+
.description("View or update usage tracking preference")
|
|
28
|
+
.option("--enable", "Enable usage tracking")
|
|
29
|
+
.option("--disable", "Disable usage tracking (paid only)")
|
|
30
|
+
.option("--json", "Output as JSON")
|
|
31
|
+
.action(async (opts) => {
|
|
32
|
+
await usageTrackingCommand({
|
|
33
|
+
json: Boolean(opts.json),
|
|
34
|
+
enable: Boolean(opts.enable),
|
|
35
|
+
disable: Boolean(opts.disable),
|
|
36
|
+
}, defaultRuntime);
|
|
37
|
+
});
|
|
24
38
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CLAUDE_CLI_PROFILE_ID, CODEX_CLI_PROFILE_ID, } from "../agents/auth-profiles.js";
|
|
2
1
|
import chalk from "chalk";
|
|
2
|
+
import { CLAUDE_CLI_PROFILE_ID, CODEX_CLI_PROFILE_ID, } from "../agents/auth-profiles.js";
|
|
3
3
|
function formatOAuthHint(expires, opts) {
|
|
4
4
|
if (!expires) {
|
|
5
5
|
return chalk.dim("token unavailable");
|
|
@@ -65,11 +65,16 @@ export function buildAuthChoiceOptions(params) {
|
|
|
65
65
|
label: "OpenAI Codex (ChatGPT OAuth)",
|
|
66
66
|
});
|
|
67
67
|
options.push({ value: "openai-api-key", label: "OpenAI API key" });
|
|
68
|
+
options.push({
|
|
69
|
+
value: "github-copilot",
|
|
70
|
+
label: "GitHub Copilot (device login)",
|
|
71
|
+
});
|
|
68
72
|
options.push({
|
|
69
73
|
value: "antigravity",
|
|
70
74
|
label: "Google Antigravity (Claude Opus 4.5, Gemini 3, etc.)",
|
|
71
75
|
});
|
|
72
76
|
options.push({ value: "gemini-api-key", label: "Google Gemini API key" });
|
|
77
|
+
options.push({ value: "chutes", label: "Chutes OAuth (remote)" });
|
|
73
78
|
options.push({ value: "apiKey", label: "Anthropic API key" });
|
|
74
79
|
options.push({ value: "minimax-cloud", label: "MiniMax M2.1 (minimax.io)" });
|
|
75
80
|
options.push({ value: "minimax", label: "Minimax M2.1 (LM Studio)" });
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { CLAUDE_CLI_PROFILE_ID, ensureAuthProfileStore, upsertAuthProfile, } from "../agents/auth-profiles.js";
|
|
2
|
-
import { applyAuthProfileConfig } from "./onboard-auth.js";
|
|
3
2
|
import { buildTokenProfileId, validateAnthropicSetupToken, } from "./auth-token.js";
|
|
3
|
+
import { CHUTES_TOKEN_ENDPOINT } from "../agents/chutes-oauth.js";
|
|
4
|
+
import { importCliCredential } from "./credential.js";
|
|
5
|
+
import { applyAuthProfileConfig, writeOAuthCredentials } from "./onboard-auth.js";
|
|
4
6
|
export async function applyAuthChoice(params) {
|
|
5
7
|
let nextConfig = params.config;
|
|
6
|
-
|
|
8
|
+
const agentModelOverride = undefined;
|
|
7
9
|
if (params.authChoice === "claude-cli") {
|
|
8
10
|
const store = ensureAuthProfileStore();
|
|
9
11
|
const hasClaudeCli = Boolean(store.profiles[CLAUDE_CLI_PROFILE_ID]);
|
|
@@ -21,8 +23,21 @@ export async function applyAuthChoice(params) {
|
|
|
21
23
|
return { config: nextConfig, agentModelOverride };
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
|
-
|
|
25
|
-
if (!
|
|
26
|
+
let hasProfile = hasClaudeCli;
|
|
27
|
+
if (!hasProfile) {
|
|
28
|
+
try {
|
|
29
|
+
await importCliCredential({
|
|
30
|
+
source: "claude-cli",
|
|
31
|
+
allowKeychainPrompt: true,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// ignore; we will prompt for setup-token below
|
|
36
|
+
}
|
|
37
|
+
const refreshed = ensureAuthProfileStore();
|
|
38
|
+
hasProfile = Boolean(refreshed.profiles[CLAUDE_CLI_PROFILE_ID]);
|
|
39
|
+
}
|
|
40
|
+
if (!hasProfile) {
|
|
26
41
|
if (process.stdin.isTTY) {
|
|
27
42
|
const runNow = await params.prompter.confirm({
|
|
28
43
|
message: "Run `claude setup-token` now?",
|
|
@@ -41,6 +56,16 @@ export async function applyAuthChoice(params) {
|
|
|
41
56
|
else {
|
|
42
57
|
await params.prompter.note("`claude setup-token` requires an interactive TTY.", "Claude setup-token");
|
|
43
58
|
}
|
|
59
|
+
try {
|
|
60
|
+
await importCliCredential({
|
|
61
|
+
source: "claude-cli",
|
|
62
|
+
allowKeychainPrompt: true,
|
|
63
|
+
force: true,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// ignore; handled below
|
|
68
|
+
}
|
|
44
69
|
const refreshed = ensureAuthProfileStore();
|
|
45
70
|
if (!refreshed.profiles[CLAUDE_CLI_PROFILE_ID]) {
|
|
46
71
|
await params.prompter.note(process.platform === "darwin"
|
|
@@ -83,6 +108,16 @@ export async function applyAuthChoice(params) {
|
|
|
83
108
|
await params.prompter.note(`claude setup-token failed (exit ${res.status})`, "Anthropic setup-token");
|
|
84
109
|
return { config: nextConfig, agentModelOverride };
|
|
85
110
|
}
|
|
111
|
+
try {
|
|
112
|
+
await importCliCredential({
|
|
113
|
+
source: "claude-cli",
|
|
114
|
+
allowKeychainPrompt: true,
|
|
115
|
+
force: true,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// ignore; handled below
|
|
120
|
+
}
|
|
86
121
|
const store = ensureAuthProfileStore();
|
|
87
122
|
if (!store.profiles[CLAUDE_CLI_PROFILE_ID]) {
|
|
88
123
|
await params.prompter.note(`No Claude CLI credentials found after setup-token. Expected ${CLAUDE_CLI_PROFILE_ID}.`, "Anthropic setup-token");
|
|
@@ -107,7 +142,9 @@ export async function applyAuthChoice(params) {
|
|
|
107
142
|
message: "Paste Anthropic setup-token",
|
|
108
143
|
validate: (value) => validateAnthropicSetupToken(String(value ?? "")),
|
|
109
144
|
});
|
|
110
|
-
const
|
|
145
|
+
const tokenInput = String(tokenRaw).trim();
|
|
146
|
+
const tokenMatch = tokenInput.match(/sk-ant-oat01-[A-Za-z0-9_-]+/);
|
|
147
|
+
const token = tokenMatch?.[0] ?? tokenInput;
|
|
111
148
|
const profileNameRaw = await params.prompter.text({
|
|
112
149
|
message: "Token name (blank = default)",
|
|
113
150
|
placeholder: "default",
|
|
@@ -130,5 +167,120 @@ export async function applyAuthChoice(params) {
|
|
|
130
167
|
mode: "token",
|
|
131
168
|
});
|
|
132
169
|
}
|
|
170
|
+
else if (params.authChoice === "chutes") {
|
|
171
|
+
const clientId = process.env.CHUTES_CLIENT_ID?.trim();
|
|
172
|
+
if (!clientId) {
|
|
173
|
+
params.runtime.error("CHUTES_CLIENT_ID is required for Chutes OAuth.");
|
|
174
|
+
params.runtime.exit(1);
|
|
175
|
+
return { config: nextConfig, agentModelOverride };
|
|
176
|
+
}
|
|
177
|
+
const rawInput = await params.prompter.text({
|
|
178
|
+
message: "Paste the redirect URL (or authorization code)",
|
|
179
|
+
});
|
|
180
|
+
const raw = String(rawInput ?? "").trim();
|
|
181
|
+
if (!raw) {
|
|
182
|
+
params.runtime.error("Missing Chutes authorization code.");
|
|
183
|
+
params.runtime.exit(1);
|
|
184
|
+
return { config: nextConfig, agentModelOverride };
|
|
185
|
+
}
|
|
186
|
+
let code = raw;
|
|
187
|
+
try {
|
|
188
|
+
const url = new URL(raw);
|
|
189
|
+
code = url.searchParams.get("code") ?? url.searchParams.get("authorization_code") ?? raw;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// leave raw as code
|
|
193
|
+
}
|
|
194
|
+
const tokenRes = await fetch(CHUTES_TOKEN_ENDPOINT, {
|
|
195
|
+
method: "POST",
|
|
196
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
197
|
+
body: new URLSearchParams({
|
|
198
|
+
grant_type: "authorization_code",
|
|
199
|
+
code,
|
|
200
|
+
client_id: clientId,
|
|
201
|
+
}),
|
|
202
|
+
});
|
|
203
|
+
if (!tokenRes.ok) {
|
|
204
|
+
const text = await tokenRes.text().catch(() => "");
|
|
205
|
+
params.runtime.error(`Chutes token exchange failed (${tokenRes.status}): ${text || "no response"}`);
|
|
206
|
+
params.runtime.exit(1);
|
|
207
|
+
return { config: nextConfig, agentModelOverride };
|
|
208
|
+
}
|
|
209
|
+
const tokenJson = (await tokenRes.json());
|
|
210
|
+
const accessToken = tokenJson.access_token?.trim();
|
|
211
|
+
const refreshToken = tokenJson.refresh_token?.trim();
|
|
212
|
+
if (!accessToken || !refreshToken) {
|
|
213
|
+
params.runtime.error("Chutes token response missing access or refresh token.");
|
|
214
|
+
params.runtime.exit(1);
|
|
215
|
+
return { config: nextConfig, agentModelOverride };
|
|
216
|
+
}
|
|
217
|
+
const expiresIn = typeof tokenJson.expires_in === "number"
|
|
218
|
+
? tokenJson.expires_in
|
|
219
|
+
: Number.parseInt(String(tokenJson.expires_in ?? ""), 10);
|
|
220
|
+
const expiresAt = Number.isFinite(expiresIn) && expiresIn > 0
|
|
221
|
+
? Date.now() + expiresIn * 1000
|
|
222
|
+
: undefined;
|
|
223
|
+
const userRes = await fetch("https://api.chutes.ai/idp/userinfo", {
|
|
224
|
+
headers: { authorization: `Bearer ${accessToken}` },
|
|
225
|
+
});
|
|
226
|
+
if (!userRes.ok) {
|
|
227
|
+
const text = await userRes.text().catch(() => "");
|
|
228
|
+
params.runtime.error(`Chutes userinfo failed (${userRes.status}): ${text || "no response"}`);
|
|
229
|
+
params.runtime.exit(1);
|
|
230
|
+
return { config: nextConfig, agentModelOverride };
|
|
231
|
+
}
|
|
232
|
+
const userJson = (await userRes.json());
|
|
233
|
+
const account = userJson.username?.trim() || userJson.email?.trim() || "default";
|
|
234
|
+
const expires = typeof expiresAt === "number" && Number.isFinite(expiresAt)
|
|
235
|
+
? expiresAt
|
|
236
|
+
: Date.now() + 3600_000;
|
|
237
|
+
const oauthCreds = {
|
|
238
|
+
access: accessToken,
|
|
239
|
+
refresh: refreshToken,
|
|
240
|
+
expires,
|
|
241
|
+
email: account,
|
|
242
|
+
};
|
|
243
|
+
await writeOAuthCredentials("chutes", oauthCreds);
|
|
244
|
+
const profileId = `chutes:${account}`;
|
|
245
|
+
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
246
|
+
profileId,
|
|
247
|
+
provider: "chutes",
|
|
248
|
+
mode: "oauth",
|
|
249
|
+
email: account,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
else if (params.authChoice === "github-copilot") {
|
|
253
|
+
try {
|
|
254
|
+
const { githubCopilotLoginCommand } = await import("../providers/github-copilot-auth.js");
|
|
255
|
+
await githubCopilotLoginCommand({ yes: true }, params.runtime);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
params.runtime.error(`GitHub Copilot login failed: ${String(err)}`);
|
|
259
|
+
params.runtime.exit(1);
|
|
260
|
+
return { config: nextConfig, agentModelOverride };
|
|
261
|
+
}
|
|
262
|
+
const profileId = "github-copilot:github";
|
|
263
|
+
nextConfig = applyAuthProfileConfig(nextConfig, {
|
|
264
|
+
profileId,
|
|
265
|
+
provider: "github-copilot",
|
|
266
|
+
mode: "token",
|
|
267
|
+
});
|
|
268
|
+
if (params.setDefaultModel) {
|
|
269
|
+
const existing = nextConfig.agent?.model;
|
|
270
|
+
const fallbacks = existing && typeof existing === "object" && "fallbacks" in existing
|
|
271
|
+
? { fallbacks: existing.fallbacks }
|
|
272
|
+
: undefined;
|
|
273
|
+
nextConfig = {
|
|
274
|
+
...nextConfig,
|
|
275
|
+
agent: {
|
|
276
|
+
...nextConfig.agent,
|
|
277
|
+
model: {
|
|
278
|
+
...fallbacks,
|
|
279
|
+
primary: "github-copilot/gpt-4o",
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
133
285
|
return { config: nextConfig, agentModelOverride };
|
|
134
286
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
1
2
|
import fs from "node:fs/promises";
|
|
2
3
|
import path from "node:path";
|
|
3
|
-
import { execFile } from "node:child_process";
|
|
4
4
|
import { promisify } from "node:util";
|
|
5
5
|
import { installSkill } from "../agents/skills-install.js";
|
|
6
|
-
import { resolveStateDir } from "../config/paths.js";
|
|
6
|
+
import { resolveBootstrapPath, resolveStateDir } from "../config/paths.js";
|
|
7
7
|
import { NEXUS_ROOT } from "../utils.js";
|
|
8
8
|
const execFileAsync = promisify(execFile);
|
|
9
9
|
function firstName(full) {
|
|
@@ -15,7 +15,10 @@ function firstName(full) {
|
|
|
15
15
|
function coerceStringArray(input) {
|
|
16
16
|
if (!Array.isArray(input))
|
|
17
17
|
return [];
|
|
18
|
-
return input
|
|
18
|
+
return input
|
|
19
|
+
.map((v) => String(v))
|
|
20
|
+
.map((s) => s.trim())
|
|
21
|
+
.filter(Boolean);
|
|
19
22
|
}
|
|
20
23
|
function parseEveWhoamiJson(stdout) {
|
|
21
24
|
const raw = stdout.trim();
|
|
@@ -104,16 +107,15 @@ export async function applyBootstrapPreset(params) {
|
|
|
104
107
|
const { workspaceDir, runtime } = params;
|
|
105
108
|
const stateDir = resolveStateDir();
|
|
106
109
|
const agentId = process.env.NEXUS_AGENT_ID?.trim() || "default";
|
|
107
|
-
const agentIdentityDir = path.join(stateDir, "agents", agentId
|
|
108
|
-
const userIdentityDir = path.join(stateDir, "user"
|
|
109
|
-
const
|
|
110
|
-
const bootstrapPath = path.join(onboardingDir, "BOOTSTRAP.md");
|
|
110
|
+
const agentIdentityDir = path.join(stateDir, "agents", agentId);
|
|
111
|
+
const userIdentityDir = path.join(stateDir, "user");
|
|
112
|
+
const bootstrapPath = resolveBootstrapPath(undefined, stateDir);
|
|
111
113
|
if (!(await fileExists(bootstrapPath)))
|
|
112
114
|
return;
|
|
113
115
|
await fs.mkdir(agentIdentityDir, { recursive: true });
|
|
114
116
|
await fs.mkdir(userIdentityDir, { recursive: true });
|
|
115
117
|
const identityPath = path.join(agentIdentityDir, "IDENTITY.md");
|
|
116
|
-
const userPath = path.join(userIdentityDir, "
|
|
118
|
+
const userPath = path.join(userIdentityDir, "IDENTITY.md");
|
|
117
119
|
const soulPath = path.join(agentIdentityDir, "SOUL.md");
|
|
118
120
|
const agentsPath = path.join(NEXUS_ROOT, "AGENTS.md");
|
|
119
121
|
const preset = resolvePreset(params.preset);
|
|
@@ -151,7 +153,9 @@ export async function applyBootstrapPreset(params) {
|
|
|
151
153
|
runtime.log(`Eve init failed; continuing without Eve identity: ${err instanceof Error ? err.message : String(err)}`);
|
|
152
154
|
}
|
|
153
155
|
try {
|
|
154
|
-
const res = await execFileAsync(eveCmd, ["whoami"], {
|
|
156
|
+
const res = await execFileAsync(eveCmd, ["whoami"], {
|
|
157
|
+
timeout: 30_000,
|
|
158
|
+
});
|
|
155
159
|
const whoami = parseEveWhoamiJson(res.stdout);
|
|
156
160
|
if (whoami?.name)
|
|
157
161
|
userName = whoami.name;
|
|
@@ -169,17 +173,27 @@ export async function applyBootstrapPreset(params) {
|
|
|
169
173
|
userName = "Test User";
|
|
170
174
|
if (!preferredAddress)
|
|
171
175
|
preferredAddress = firstName(userName) || "friend";
|
|
172
|
-
const identityMd =
|
|
176
|
+
const identityMd = `---
|
|
177
|
+
name: ${agentName}
|
|
178
|
+
emoji: ${preset.emoji}
|
|
179
|
+
creature: ${preset.creature}
|
|
180
|
+
vibe: ${preset.vibe}
|
|
181
|
+
---
|
|
182
|
+
# IDENTITY.md - Agent Identity
|
|
173
183
|
|
|
174
184
|
- Name: ${agentName}
|
|
175
185
|
- Creature: ${preset.creature}
|
|
176
186
|
- Vibe: ${preset.vibe}
|
|
177
187
|
- Emoji: ${preset.emoji}
|
|
178
188
|
`;
|
|
179
|
-
const userMd =
|
|
189
|
+
const userMd = `---
|
|
190
|
+
name: ${userName}
|
|
191
|
+
call: ${preferredAddress}
|
|
192
|
+
---
|
|
193
|
+
# IDENTITY.md - User Identity
|
|
180
194
|
|
|
181
195
|
- Name: ${userName}
|
|
182
|
-
-
|
|
196
|
+
- What to call them: ${preferredAddress}
|
|
183
197
|
- Pronouns (optional):
|
|
184
198
|
- Timezone (optional):
|
|
185
199
|
- Notes:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defaultRuntime } from "../runtime.js";
|
|
2
1
|
import { detectCapabilities } from "../capabilities/detector.js";
|
|
2
|
+
import { defaultRuntime } from "../runtime.js";
|
|
3
3
|
const STATUS_ICON = {
|
|
4
4
|
active: "✅",
|
|
5
5
|
ready: "⭐",
|
|
@@ -8,28 +8,55 @@ const STATUS_ICON = {
|
|
|
8
8
|
unavailable: "⛔",
|
|
9
9
|
broken: "❌",
|
|
10
10
|
};
|
|
11
|
+
function normalizeCategory(input) {
|
|
12
|
+
return input.toLowerCase().replace(/[^a-z0-9]+/g, "");
|
|
13
|
+
}
|
|
14
|
+
function normalizeStatus(input) {
|
|
15
|
+
if (!input)
|
|
16
|
+
return undefined;
|
|
17
|
+
return input.toLowerCase().replace(/-/g, "_");
|
|
18
|
+
}
|
|
11
19
|
export async function capabilitiesCommand(opts, runtime = defaultRuntime) {
|
|
12
20
|
const { registry, capabilities, summary } = detectCapabilities();
|
|
21
|
+
const statusFilter = normalizeStatus(opts?.status);
|
|
22
|
+
const categoryFilter = opts?.category
|
|
23
|
+
? normalizeCategory(opts.category)
|
|
24
|
+
: undefined;
|
|
25
|
+
const filtered = capabilities.filter((cap) => {
|
|
26
|
+
if (statusFilter && cap.status !== statusFilter)
|
|
27
|
+
return false;
|
|
28
|
+
if (categoryFilter) {
|
|
29
|
+
const normalized = normalizeCategory(cap.category);
|
|
30
|
+
if (normalized !== categoryFilter)
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
});
|
|
13
35
|
if (opts?.json) {
|
|
14
36
|
runtime.log(JSON.stringify({
|
|
15
37
|
platform: `${process.platform}/${process.arch}`,
|
|
16
38
|
summary,
|
|
17
|
-
capabilities,
|
|
39
|
+
capabilities: filtered,
|
|
18
40
|
}, null, 2));
|
|
19
41
|
return;
|
|
20
42
|
}
|
|
21
43
|
runtime.log(`\nNexus Capabilities (${process.platform}/${process.arch})`);
|
|
22
44
|
runtime.log("Legend: ✅ active ⭐ ready 🔧 needs-setup 📥 needs-install ⛔ unavailable ❌ broken\n");
|
|
23
|
-
for (const [category,
|
|
24
|
-
const categoryCaps =
|
|
45
|
+
for (const [category, _entries] of Object.entries(registry.categories)) {
|
|
46
|
+
const categoryCaps = filtered.filter((cap) => cap.category === category);
|
|
25
47
|
if (categoryCaps.length === 0)
|
|
26
48
|
continue;
|
|
27
49
|
const activeCount = categoryCaps.filter((cap) => cap.status === "active").length;
|
|
28
50
|
runtime.log(`${category} (${activeCount}/${categoryCaps.length})`);
|
|
29
51
|
for (const cap of categoryCaps) {
|
|
30
52
|
const icon = STATUS_ICON[cap.status] ?? "•";
|
|
31
|
-
|
|
32
|
-
|
|
53
|
+
if (opts?.compact) {
|
|
54
|
+
runtime.log(` ${icon} ${cap.id}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
const providers = cap.providers.map((p) => p.id).join(", ");
|
|
58
|
+
runtime.log(` ${icon} ${cap.id} — ${providers || cap.providersRaw}`);
|
|
59
|
+
}
|
|
33
60
|
}
|
|
34
61
|
runtime.log("");
|
|
35
62
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { buildWorkspaceSkillSnapshot, loadWorkspaceSkillEntries,
|
|
3
|
+
import { buildWorkspaceSkillSnapshot, getSkillMetadata, loadWorkspaceSkillEntries, } from "../agents/skills.js";
|
|
4
4
|
import { loadConfig } from "../config/config.js";
|
|
5
5
|
import { defaultRuntime } from "../runtime.js";
|
|
6
6
|
/**
|
|
@@ -17,7 +17,8 @@ import { defaultRuntime } from "../runtime.js";
|
|
|
17
17
|
* nexus claude-md [--workspace <path>]
|
|
18
18
|
*/
|
|
19
19
|
export async function claudeMdCommand(opts, runtime = defaultRuntime) {
|
|
20
|
-
const workspaceDir = opts?.workspace?.trim() ||
|
|
20
|
+
const workspaceDir = opts?.workspace?.trim() ||
|
|
21
|
+
path.join(process.env.HOME || "~", "nexus", "home");
|
|
21
22
|
runtime.log(`Generating CLAUDE.md for workspace: ${workspaceDir}`);
|
|
22
23
|
// Load config
|
|
23
24
|
const config = loadConfig();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { defaultRuntime } from "../runtime.js";
|
|
2
1
|
import { readConfigFileSnapshot } from "../config/config.js";
|
|
2
|
+
import { defaultRuntime } from "../runtime.js";
|
|
3
3
|
export async function configViewCommand(opts, runtime = defaultRuntime) {
|
|
4
4
|
const snapshot = await readConfigFileSnapshot();
|
|
5
5
|
if (opts?.json) {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { loadConfig, readConfigFileSnapshot, writeConfigFile } from "../config/config.js";
|
|
2
|
+
import { defaultRuntime } from "../runtime.js";
|
|
3
|
+
function getByPath(obj, key) {
|
|
4
|
+
const parts = key.split(".").filter(Boolean);
|
|
5
|
+
let current = obj;
|
|
6
|
+
for (const part of parts) {
|
|
7
|
+
if (!current || typeof current !== "object")
|
|
8
|
+
return undefined;
|
|
9
|
+
current = current[part];
|
|
10
|
+
}
|
|
11
|
+
return current;
|
|
12
|
+
}
|
|
13
|
+
function setByPath(obj, key, value) {
|
|
14
|
+
const parts = key.split(".").filter(Boolean);
|
|
15
|
+
let current = obj;
|
|
16
|
+
for (let i = 0; i < parts.length; i += 1) {
|
|
17
|
+
const part = parts[i];
|
|
18
|
+
if (i === parts.length - 1) {
|
|
19
|
+
current[part] = value;
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
const next = current[part];
|
|
23
|
+
if (!next || typeof next !== "object") {
|
|
24
|
+
current[part] = {};
|
|
25
|
+
}
|
|
26
|
+
current = current[part];
|
|
27
|
+
}
|
|
28
|
+
return obj;
|
|
29
|
+
}
|
|
30
|
+
function parseValue(raw) {
|
|
31
|
+
const trimmed = raw.trim();
|
|
32
|
+
if (!trimmed)
|
|
33
|
+
return "";
|
|
34
|
+
if (trimmed === "true")
|
|
35
|
+
return true;
|
|
36
|
+
if (trimmed === "false")
|
|
37
|
+
return false;
|
|
38
|
+
if (!Number.isNaN(Number(trimmed)))
|
|
39
|
+
return Number(trimmed);
|
|
40
|
+
if ((trimmed.startsWith("{") && trimmed.endsWith("}")) ||
|
|
41
|
+
(trimmed.startsWith("[") && trimmed.endsWith("]"))) {
|
|
42
|
+
try {
|
|
43
|
+
return JSON.parse(trimmed);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return trimmed;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return trimmed;
|
|
50
|
+
}
|
|
51
|
+
export async function configListCommand(opts, runtime = defaultRuntime) {
|
|
52
|
+
const snapshot = await readConfigFileSnapshot();
|
|
53
|
+
const payload = snapshot.valid ? snapshot.parsed : {};
|
|
54
|
+
if (opts?.json) {
|
|
55
|
+
runtime.log(JSON.stringify(payload, null, 2));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
runtime.log(JSON.stringify(payload, null, 2));
|
|
59
|
+
}
|
|
60
|
+
export async function configGetCommand(opts, runtime = defaultRuntime) {
|
|
61
|
+
const config = loadConfig();
|
|
62
|
+
const value = getByPath(config, opts.key);
|
|
63
|
+
if (opts.json) {
|
|
64
|
+
runtime.log(JSON.stringify({ key: opts.key, value }, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
if (typeof value === "string") {
|
|
68
|
+
runtime.log(value);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
runtime.log(JSON.stringify(value ?? null, null, 2));
|
|
72
|
+
}
|
|
73
|
+
export async function configSetCommand(opts, runtime = defaultRuntime) {
|
|
74
|
+
const snapshot = await readConfigFileSnapshot();
|
|
75
|
+
const base = snapshot.valid && snapshot.parsed && typeof snapshot.parsed === "object"
|
|
76
|
+
? snapshot.parsed
|
|
77
|
+
: {};
|
|
78
|
+
const next = setByPath({ ...base }, opts.key, parseValue(opts.value));
|
|
79
|
+
await writeConfigFile(next);
|
|
80
|
+
if (opts.json) {
|
|
81
|
+
runtime.log(JSON.stringify({ key: opts.key, value: getByPath(next, opts.key) }, null, 2));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
runtime.log(`Updated ${opts.key}`);
|
|
85
|
+
}
|
|
@@ -430,11 +430,11 @@ export async function runConfigureWizard(opts, runtime = defaultRuntime) {
|
|
|
430
430
|
}
|
|
431
431
|
}
|
|
432
432
|
const localUrl = "ws://127.0.0.1:18789";
|
|
433
|
-
const
|
|
433
|
+
const _localToken = baseConfig.gateway?.auth?.token ?? process.env.NEXUS_GATEWAY_TOKEN;
|
|
434
434
|
const configPassword = baseConfig.gateway?.auth?.password;
|
|
435
435
|
const envPassword = process.env.NEXUS_GATEWAY_PASSWORD;
|
|
436
|
-
const
|
|
437
|
-
|
|
436
|
+
const _primaryPassword = configPassword ?? envPassword;
|
|
437
|
+
const localProbe = await probeGatewayReachable({
|
|
438
438
|
url: localUrl,
|
|
439
439
|
token: baseConfig.gateway?.auth?.token ?? process.env.CLAWDBOT_GATEWAY_TOKEN,
|
|
440
440
|
password: baseConfig.gateway?.auth?.password ??
|
|
@@ -599,7 +599,7 @@ export async function runConfigureWizard(opts, runtime = defaultRuntime) {
|
|
|
599
599
|
password: oldPassword,
|
|
600
600
|
});
|
|
601
601
|
}
|
|
602
|
-
const
|
|
602
|
+
const _gatewayStatusLine = gatewayProbe.ok
|
|
603
603
|
? "Gateway: reachable"
|
|
604
604
|
: `Gateway: not detected${gatewayProbe.detail ? ` (${gatewayProbe.detail})` : ""}`;
|
|
605
605
|
note((() => {
|