@intent-systems/nexus 2026.1.5-5 → 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/identity-state.js +45 -23
- package/dist/agents/skill-runner.js +12 -2
- package/dist/agents/skill-usage.js +4 -7
- package/dist/agents/skills-status.js +3 -2
- package/dist/agents/skills.js +20 -23
- package/dist/agents/workspace.js +32 -19
- package/dist/capabilities/detector.js +2 -2
- package/dist/cli/cloud-cli.js +58 -0
- package/dist/cli/credential-cli.js +77 -8
- package/dist/cli/program.js +24 -2
- package/dist/cli/skills-cli.js +30 -18
- package/dist/cli/skills-hub-cli.js +9 -7
- package/dist/commands/bootstrap-preset.js +16 -6
- package/dist/commands/config.js +85 -0
- package/dist/commands/cursor-hooks.js +240 -0
- package/dist/commands/cursor-rules.js +13 -207
- package/dist/commands/identity.js +3 -3
- package/dist/commands/init.js +293 -6
- package/dist/commands/onboard-eve-identity.js +1 -1
- package/dist/commands/skills-manifest.js +89 -29
- package/dist/commands/status.js +52 -50
- package/dist/daemon/launchd.js +14 -0
- package/dist/entry.js +0 -0
- 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/utils.js +6 -2
- 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
|
@@ -2,7 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import fsp from "node:fs/promises";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import {
|
|
5
|
+
import { SKILLS_STATE_DIR } from "../utils.js";
|
|
6
6
|
/**
|
|
7
7
|
* Parse skill frontmatter to extract name and description
|
|
8
8
|
*/
|
|
@@ -16,7 +16,7 @@ function parseSkillFrontmatter(content) {
|
|
|
16
16
|
return result;
|
|
17
17
|
const block = normalized.slice(4, endIndex);
|
|
18
18
|
for (const line of block.split("\n")) {
|
|
19
|
-
const match = line.match(/^(name|description):\s*(.*)$/);
|
|
19
|
+
const match = line.match(/^(name|description|type|metadata):\s*(.*)$/);
|
|
20
20
|
if (!match)
|
|
21
21
|
continue;
|
|
22
22
|
const key = match[1];
|
|
@@ -26,10 +26,40 @@ function parseSkillFrontmatter(content) {
|
|
|
26
26
|
(value.startsWith("'") && value.endsWith("'"))) {
|
|
27
27
|
value = value.slice(1, -1);
|
|
28
28
|
}
|
|
29
|
-
|
|
29
|
+
if (key === "metadata") {
|
|
30
|
+
result.metadataRaw = value;
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
result[key] = value;
|
|
34
|
+
}
|
|
30
35
|
}
|
|
31
36
|
return result;
|
|
32
37
|
}
|
|
38
|
+
function resolveSkillRootDirs(rootDir) {
|
|
39
|
+
const typedDirs = ["tools", "connectors", "guides"].map((segment) => path.join(rootDir, segment));
|
|
40
|
+
const existingTyped = typedDirs.filter((dir) => fs.existsSync(dir));
|
|
41
|
+
if (existingTyped.length > 0)
|
|
42
|
+
return existingTyped;
|
|
43
|
+
return fs.existsSync(rootDir) ? [rootDir] : [];
|
|
44
|
+
}
|
|
45
|
+
function resolveSkillType(frontmatter) {
|
|
46
|
+
if (frontmatter.type === "tool" || frontmatter.type === "connector" || frontmatter.type === "guide") {
|
|
47
|
+
return frontmatter.type;
|
|
48
|
+
}
|
|
49
|
+
if (!frontmatter.metadataRaw)
|
|
50
|
+
return null;
|
|
51
|
+
try {
|
|
52
|
+
const parsed = JSON.parse(frontmatter.metadataRaw);
|
|
53
|
+
const type = parsed?.nexus?.type;
|
|
54
|
+
if (type === "tool" || type === "connector" || type === "guide") {
|
|
55
|
+
return type;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
33
63
|
/**
|
|
34
64
|
* Resolve the bundled skills directory from the installed Nexus package.
|
|
35
65
|
* This finds skills shipped with the CLI, NOT from user workspace.
|
|
@@ -98,6 +128,17 @@ async function scanSkillsDir(dir, source) {
|
|
|
98
128
|
}
|
|
99
129
|
return skills;
|
|
100
130
|
}
|
|
131
|
+
async function scanSkillRoots(rootDir, source) {
|
|
132
|
+
const roots = resolveSkillRootDirs(rootDir);
|
|
133
|
+
const merged = {};
|
|
134
|
+
for (const root of roots) {
|
|
135
|
+
const scanned = await scanSkillsDir(root, source);
|
|
136
|
+
for (const [name, entry] of Object.entries(scanned)) {
|
|
137
|
+
merged[name] = entry;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return merged;
|
|
141
|
+
}
|
|
101
142
|
/**
|
|
102
143
|
* Copy bundled skills from installed package to ~/nexus/skills/
|
|
103
144
|
*/
|
|
@@ -113,29 +154,48 @@ export async function copyBundledSkills(targetDir) {
|
|
|
113
154
|
return result;
|
|
114
155
|
}
|
|
115
156
|
await fsp.mkdir(targetDir, { recursive: true });
|
|
116
|
-
const
|
|
117
|
-
for (const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
continue;
|
|
122
|
-
const sourcePath = path.join(bundledDir, entry.name);
|
|
123
|
-
const targetPath = path.join(targetDir, entry.name);
|
|
124
|
-
// Check if SKILL.md exists
|
|
125
|
-
if (!fs.existsSync(path.join(sourcePath, "SKILL.md")))
|
|
126
|
-
continue;
|
|
127
|
-
try {
|
|
128
|
-
// Check if already exists
|
|
129
|
-
if (fs.existsSync(targetPath)) {
|
|
130
|
-
result.skipped.push(entry.name);
|
|
157
|
+
const bundledRoots = resolveSkillRootDirs(bundledDir);
|
|
158
|
+
for (const root of bundledRoots) {
|
|
159
|
+
const entries = await fsp.readdir(root, { withFileTypes: true });
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
if (!entry.isDirectory())
|
|
131
162
|
continue;
|
|
163
|
+
if (entry.name.startsWith("."))
|
|
164
|
+
continue;
|
|
165
|
+
const sourcePath = path.join(root, entry.name);
|
|
166
|
+
const skillPath = path.join(sourcePath, "SKILL.md");
|
|
167
|
+
if (!fs.existsSync(skillPath))
|
|
168
|
+
continue;
|
|
169
|
+
let targetBase = targetDir;
|
|
170
|
+
if (root !== bundledDir) {
|
|
171
|
+
targetBase = path.join(targetDir, path.basename(root));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
try {
|
|
175
|
+
const content = await fsp.readFile(skillPath, "utf-8");
|
|
176
|
+
const frontmatter = parseSkillFrontmatter(content);
|
|
177
|
+
const type = resolveSkillType(frontmatter);
|
|
178
|
+
if (type) {
|
|
179
|
+
targetBase = path.join(targetDir, `${type}s`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// keep default targetBase
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const targetPath = path.join(targetBase, entry.name);
|
|
187
|
+
try {
|
|
188
|
+
await fsp.mkdir(targetBase, { recursive: true });
|
|
189
|
+
if (fs.existsSync(targetPath)) {
|
|
190
|
+
result.skipped.push(entry.name);
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
await fsp.cp(sourcePath, targetPath, { recursive: true });
|
|
194
|
+
result.copied.push(entry.name);
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
result.errors.push(`${entry.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
132
198
|
}
|
|
133
|
-
// Copy recursively
|
|
134
|
-
await fsp.cp(sourcePath, targetPath, { recursive: true });
|
|
135
|
-
result.copied.push(entry.name);
|
|
136
|
-
}
|
|
137
|
-
catch (err) {
|
|
138
|
-
result.errors.push(`${entry.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
139
199
|
}
|
|
140
200
|
}
|
|
141
201
|
return result;
|
|
@@ -145,17 +205,17 @@ export async function copyBundledSkills(targetDir) {
|
|
|
145
205
|
*/
|
|
146
206
|
export async function generateSkillManifest(skillsDir, userSkillsDir) {
|
|
147
207
|
// Skills in ~/nexus/skills/ are considered "bundled" (copied from package)
|
|
148
|
-
//
|
|
208
|
+
// Managed skills live under ~/nexus/skills/managed/
|
|
149
209
|
// User skills are in ~/nexus/home/skills/
|
|
150
|
-
const bundledSkills = await
|
|
210
|
+
const bundledSkills = await scanSkillRoots(skillsDir, "bundled");
|
|
151
211
|
// Check for managed subfolder (NexusHub installs)
|
|
152
212
|
const managedDir = path.join(skillsDir, "managed");
|
|
153
213
|
const managedSkills = fs.existsSync(managedDir)
|
|
154
|
-
? await
|
|
214
|
+
? await scanSkillRoots(managedDir, "managed")
|
|
155
215
|
: {};
|
|
156
216
|
// User skills from workspace
|
|
157
217
|
const userSkills = userSkillsDir
|
|
158
|
-
? await
|
|
218
|
+
? await scanSkillRoots(userSkillsDir, "user")
|
|
159
219
|
: {};
|
|
160
220
|
return {
|
|
161
221
|
version: 1,
|
|
@@ -178,7 +238,7 @@ export async function generateSkillManifest(skillsDir, userSkillsDir) {
|
|
|
178
238
|
* Get the path to the skills manifest file
|
|
179
239
|
*/
|
|
180
240
|
export function getSkillManifestPath() {
|
|
181
|
-
return path.join(
|
|
241
|
+
return path.join(SKILLS_STATE_DIR, "manifest.json");
|
|
182
242
|
}
|
|
183
243
|
/**
|
|
184
244
|
* Write the skill manifest to disk
|
package/dist/commands/status.js
CHANGED
|
@@ -4,9 +4,7 @@ import { getAggregateStats } from "../agents/skill-usage.js";
|
|
|
4
4
|
import { detectCapabilities } from "../capabilities/detector.js";
|
|
5
5
|
import { defaultRuntime } from "../runtime.js";
|
|
6
6
|
import { listCredentials } from "./credential.js";
|
|
7
|
-
import { resolveQuestState } from "./quest-state.js";
|
|
8
7
|
const STATUS_BOX_WIDTH = 62;
|
|
9
|
-
const POWER_BOX_WIDTH = 62;
|
|
10
8
|
function clampText(text, width) {
|
|
11
9
|
if (text.length <= width)
|
|
12
10
|
return text;
|
|
@@ -30,7 +28,7 @@ const FALLBACK_BOOTSTRAP_PROMPT = `# BOOTSTRAP.md - Welcome to Nexus
|
|
|
30
28
|
Identity setup is required.
|
|
31
29
|
|
|
32
30
|
For humans: start a short conversation and share your name, goals, and preferences.
|
|
33
|
-
For agents: write
|
|
31
|
+
For agents: write IDENTITY.md, SOUL.md, and MEMORY.md for the agent, plus state/user/IDENTITY.md for the user.
|
|
34
32
|
`;
|
|
35
33
|
function readBootstrapPrompt(pathname) {
|
|
36
34
|
try {
|
|
@@ -64,6 +62,12 @@ function formatSuggestions(capabilities) {
|
|
|
64
62
|
};
|
|
65
63
|
});
|
|
66
64
|
}
|
|
65
|
+
function reindexSuggestions(suggestions) {
|
|
66
|
+
return suggestions.map((suggestion, idx) => ({
|
|
67
|
+
...suggestion,
|
|
68
|
+
index: idx + 1,
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
67
71
|
export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
68
72
|
const identityResolution = resolveIdentitySnapshot();
|
|
69
73
|
if (!identityResolution.ok) {
|
|
@@ -103,18 +107,6 @@ export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
|
103
107
|
const usage = showUsage
|
|
104
108
|
? await getAggregateStats({ windowDays: 7, limit: 3 })
|
|
105
109
|
: null;
|
|
106
|
-
const questState = showBrief
|
|
107
|
-
? null
|
|
108
|
-
: await resolveQuestState({
|
|
109
|
-
identityConfigured: identity.hasIdentity,
|
|
110
|
-
capabilities: capabilitySnapshot?.capabilities ?? [],
|
|
111
|
-
credentials: credentials ?? {
|
|
112
|
-
version: 1,
|
|
113
|
-
lastUpdated: "",
|
|
114
|
-
services: {},
|
|
115
|
-
},
|
|
116
|
-
includeSecrets: true,
|
|
117
|
-
});
|
|
118
110
|
if (opts.quiet) {
|
|
119
111
|
runtime.exit(bootstrapPrompt ? 2 : 0);
|
|
120
112
|
return;
|
|
@@ -130,7 +122,6 @@ export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
|
130
122
|
capabilities: capabilitySnapshot ?? undefined,
|
|
131
123
|
suggestions,
|
|
132
124
|
usage: usage ?? undefined,
|
|
133
|
-
power: questState?.power ?? undefined,
|
|
134
125
|
}, null, 2));
|
|
135
126
|
return;
|
|
136
127
|
}
|
|
@@ -147,20 +138,23 @@ export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
|
147
138
|
return;
|
|
148
139
|
}
|
|
149
140
|
runtime.log("\n👤 Identity");
|
|
150
|
-
runtime.log(` User: ${identity.userName ?? "(unknown)"} → ${identity.
|
|
141
|
+
runtime.log(` User: ${identity.userName ?? "(unknown)"} → ${identity.userIdentityPath}`);
|
|
151
142
|
runtime.log(` Agent: ${identity.agentName ?? "(unknown)"} (${identity.agentId}) → ${identity.agentIdentityPath}`);
|
|
152
143
|
runtime.log(` → ${identity.agentSoulPath}`);
|
|
153
|
-
|
|
144
|
+
const credentialServices = credentials
|
|
145
|
+
? Object.entries(credentials.services ?? {})
|
|
146
|
+
: [];
|
|
147
|
+
const credentialAccountCount = credentialServices.reduce((sum, [, info]) => sum + (info.accounts?.length ?? 0), 0);
|
|
154
148
|
if (showCredentials && credentials) {
|
|
155
|
-
|
|
156
|
-
const accountCount = services.reduce((sum, [, info]) => sum + (info.accounts?.length ?? 0), 0);
|
|
157
|
-
runtime.log(`\n🔑 Credentials (${accountCount} configured)`);
|
|
149
|
+
runtime.log(`\n🔑 Credentials (${credentialAccountCount} configured)`);
|
|
158
150
|
const statusIcon = {
|
|
159
151
|
active: "✅",
|
|
160
152
|
ready: "⭐",
|
|
161
153
|
broken: "❌",
|
|
162
154
|
};
|
|
163
|
-
|
|
155
|
+
const maxServices = 6;
|
|
156
|
+
const visibleServices = credentialServices.slice(0, maxServices);
|
|
157
|
+
for (const [service, info] of visibleServices) {
|
|
164
158
|
const accounts = info.accounts ?? [];
|
|
165
159
|
if (accounts.length === 0) {
|
|
166
160
|
runtime.log(` ${service}: none`);
|
|
@@ -174,22 +168,32 @@ export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
|
174
168
|
runtime.log(` ${icon} ${account.id} (${status})${suffix}`);
|
|
175
169
|
}
|
|
176
170
|
}
|
|
171
|
+
if (credentialServices.length > maxServices) {
|
|
172
|
+
runtime.log(` … +${credentialServices.length - maxServices} more services`);
|
|
173
|
+
}
|
|
177
174
|
runtime.log(` Run 'nexus credential list' for full details`);
|
|
178
175
|
}
|
|
179
176
|
if (showCapabilities && capabilitySnapshot) {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
177
|
+
const { summary } = capabilitySnapshot;
|
|
178
|
+
runtime.log("\n🎯 Capabilities");
|
|
179
|
+
runtime.log(` ✅ active: ${summary.active} ⭐ ready: ${summary.ready} 🔧 needs-setup: ${summary.needs_setup} 📥 needs-install: ${summary.needs_install}`);
|
|
180
|
+
if (summary.broken > 0) {
|
|
181
|
+
runtime.log(` ❌ broken: ${summary.broken}`);
|
|
182
|
+
}
|
|
183
|
+
if (summary.unavailable > 0) {
|
|
184
|
+
runtime.log(` ⛔ unavailable: ${summary.unavailable}`);
|
|
185
|
+
}
|
|
186
|
+
const quickWins = capabilitySnapshot.capabilities
|
|
187
|
+
.filter((cap) => cap.status === "ready")
|
|
188
|
+
.slice(0, 4);
|
|
189
|
+
if (quickWins.length > 0) {
|
|
190
|
+
runtime.log(" Quick wins:");
|
|
191
|
+
for (const cap of quickWins) {
|
|
189
192
|
const providers = cap.providers.map((p) => p.id).join(", ");
|
|
190
|
-
runtime.log(` - ${cap.id}
|
|
193
|
+
runtime.log(` - ${cap.id}${providers ? ` (${providers})` : ""}`);
|
|
191
194
|
}
|
|
192
195
|
}
|
|
196
|
+
runtime.log(` Run 'nexus capabilities' for the full map`);
|
|
193
197
|
}
|
|
194
198
|
if (showUsage && usage) {
|
|
195
199
|
runtime.log("\n📊 Usage (last 7 days)");
|
|
@@ -206,29 +210,27 @@ export async function statusCommand(opts, runtime = defaultRuntime) {
|
|
|
206
210
|
runtime.log(` Most used: ${mostUsed}`);
|
|
207
211
|
runtime.log(` Ready but unused: ${readyUnused}`);
|
|
208
212
|
}
|
|
209
|
-
|
|
213
|
+
let finalSuggestions = suggestions;
|
|
214
|
+
if (showCredentials && credentials && credentialAccountCount === 0) {
|
|
215
|
+
finalSuggestions = [
|
|
216
|
+
{
|
|
217
|
+
id: "credentials",
|
|
218
|
+
status: "ready",
|
|
219
|
+
index: 1,
|
|
220
|
+
title: "Set up credentials",
|
|
221
|
+
action: "nexus credential scan --deep",
|
|
222
|
+
},
|
|
223
|
+
...finalSuggestions,
|
|
224
|
+
];
|
|
225
|
+
}
|
|
226
|
+
finalSuggestions = reindexSuggestions(finalSuggestions).slice(0, 3);
|
|
227
|
+
if (finalSuggestions.length > 0) {
|
|
210
228
|
runtime.log("\n🎯 Suggestions");
|
|
211
|
-
for (const suggestion of
|
|
229
|
+
for (const suggestion of finalSuggestions) {
|
|
212
230
|
runtime.log(` ${suggestion.index}. ${suggestion.title}`);
|
|
213
231
|
runtime.log(` → ${suggestion.action}`);
|
|
214
232
|
}
|
|
215
233
|
}
|
|
216
|
-
if (questState?.power) {
|
|
217
|
-
const width = 10;
|
|
218
|
-
const filled = Math.round((questState.power.percent / 100) * width);
|
|
219
|
-
const bar = `${"#".repeat(filled)}${"-".repeat(width - filled)}`;
|
|
220
|
-
const lines = [
|
|
221
|
-
`Power Level: ${bar} ${questState.power.percent}%`,
|
|
222
|
-
questState.power.nextQuest
|
|
223
|
-
? `Next unlock: ${questState.power.nextQuest.title} (+${questState.power.nextQuest.weight}%)`
|
|
224
|
-
: "Next unlock: none",
|
|
225
|
-
"Complete the core path to reach 100%",
|
|
226
|
-
];
|
|
227
|
-
runtime.log("");
|
|
228
|
-
for (const line of renderBox(lines, POWER_BOX_WIDTH)) {
|
|
229
|
-
runtime.log(line);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
234
|
runtime.log(`\nNext: run 'nexus capabilities' or 'nexus credential list' for details.`);
|
|
233
235
|
}
|
|
234
236
|
export async function getStatusSummary() {
|
package/dist/daemon/launchd.js
CHANGED
|
@@ -74,9 +74,23 @@ export async function readLaunchAgentProgramArguments(env) {
|
|
|
74
74
|
const workingDirectory = workingDirMatch
|
|
75
75
|
? plistUnescape(workingDirMatch[1] ?? "").trim()
|
|
76
76
|
: "";
|
|
77
|
+
const envMatch = plist.match(/<key>EnvironmentVariables<\/key>\s*<dict>([\s\S]*?)<\/dict>/i);
|
|
78
|
+
let environment;
|
|
79
|
+
if (envMatch) {
|
|
80
|
+
const entries = Array.from(envMatch[1].matchAll(/<key>([\s\S]*?)<\/key>\s*<string>([\s\S]*?)<\/string>/gi))
|
|
81
|
+
.map((match) => [
|
|
82
|
+
plistUnescape(match[1] ?? "").trim(),
|
|
83
|
+
plistUnescape(match[2] ?? "").trim(),
|
|
84
|
+
])
|
|
85
|
+
.filter(([key, value]) => key && value);
|
|
86
|
+
if (entries.length > 0) {
|
|
87
|
+
environment = Object.fromEntries(entries);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
77
90
|
return {
|
|
78
91
|
programArguments: args.filter(Boolean),
|
|
79
92
|
...(workingDirectory ? { workingDirectory } : {}),
|
|
93
|
+
...(environment ? { environment } : {}),
|
|
80
94
|
};
|
|
81
95
|
}
|
|
82
96
|
catch {
|
package/dist/entry.js
CHANGED
|
File without changes
|
|
Binary file
|
|
Binary file
|
package/dist/utils.js
CHANGED
|
@@ -150,5 +150,9 @@ export function resolveNexusRoot(env = process.env, homedir = os.homedir) {
|
|
|
150
150
|
}
|
|
151
151
|
// Nexus root directory containing home/ and state/
|
|
152
152
|
export const NEXUS_ROOT = resolveNexusRoot();
|
|
153
|
-
//
|
|
154
|
-
export const
|
|
153
|
+
// Workspace skill definitions live under the Nexus root.
|
|
154
|
+
export const WORKSPACE_SKILLS_DIR = path.join(NEXUS_ROOT, "skills");
|
|
155
|
+
// Skill state + usage logs live under state/.
|
|
156
|
+
export const SKILLS_STATE_DIR = path.join(resolveStateDir(), "skills");
|
|
157
|
+
// Backward-compat alias (legacy naming).
|
|
158
|
+
export const MANAGED_SKILLS_DIR = SKILLS_STATE_DIR;
|
package/docs/AGENTS.default.md
CHANGED
|
@@ -46,7 +46,7 @@ cp docs/AGENTS.default.md ~/nexus/AGENTS.md
|
|
|
46
46
|
- Don’t send partial/streaming replies to external messaging surfaces (only final replies).
|
|
47
47
|
|
|
48
48
|
## Session start (required)
|
|
49
|
-
- Read `state/agents/{agent}/
|
|
49
|
+
- Read `state/agents/{agent}/SOUL.md`, `state/user/IDENTITY.md`, and today+yesterday in `home/memory/`.
|
|
50
50
|
- Do it before responding.
|
|
51
51
|
|
|
52
52
|
## Soul (required)
|
package/docs/configuration.md
CHANGED
|
@@ -726,7 +726,7 @@ own per-session workspaces under `agent.sandbox.workspaceRoot`.
|
|
|
726
726
|
|
|
727
727
|
### `agent.skipBootstrap`
|
|
728
728
|
|
|
729
|
-
Disables automatic creation of the workspace bootstrap files (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`,
|
|
729
|
+
Disables automatic creation of the workspace bootstrap files (`AGENTS.md`, `SOUL.md`, `TOOLS.md`, `IDENTITY.md`, and `BOOTSTRAP.md`).
|
|
730
730
|
|
|
731
731
|
Use this for pre-seeded deployments where your workspace files come from a repo.
|
|
732
732
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Feature Inventory Overview
|
|
2
2
|
|
|
3
|
-
> Scope: Nexus CLI repo (`/home/projects/nexus`) + Nexus Website repo (`/home/projects/nexus-website`)
|
|
3
|
+
> Scope: Nexus CLI repo (`/home/projects/nexus/nexus-cli`) + Nexus Website repo (`/home/projects/nexus/nexus-website`)
|
|
4
4
|
> Includes Rust cloud engine under `native/nexus-cloud`.
|
|
5
5
|
> Last updated: 2026-01-17
|
|
6
6
|
|
|
@@ -33,7 +33,7 @@ Use it to guide stabilization, documentation, and test planning.
|
|
|
33
33
|
- `nexus cloud spaces list/mount/unmount/push/pull`
|
|
34
34
|
|
|
35
35
|
### Skills (Local)
|
|
36
|
-
- `nexus skill list/info/use/
|
|
36
|
+
- `nexus skill list/info/use/verify/stats`
|
|
37
37
|
|
|
38
38
|
### Skills Hub (Remote)
|
|
39
39
|
- `nexus skills search/publish/install`
|