@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.
Files changed (245) hide show
  1. package/dist/agents/identity-state.js +45 -23
  2. package/dist/agents/skill-runner.js +12 -2
  3. package/dist/agents/skill-usage.js +4 -7
  4. package/dist/agents/skills-status.js +3 -2
  5. package/dist/agents/skills.js +20 -23
  6. package/dist/agents/workspace.js +32 -19
  7. package/dist/capabilities/detector.js +2 -2
  8. package/dist/cli/cloud-cli.js +58 -0
  9. package/dist/cli/credential-cli.js +77 -8
  10. package/dist/cli/program.js +24 -2
  11. package/dist/cli/skills-cli.js +30 -18
  12. package/dist/cli/skills-hub-cli.js +9 -7
  13. package/dist/commands/bootstrap-preset.js +16 -6
  14. package/dist/commands/config.js +85 -0
  15. package/dist/commands/cursor-hooks.js +240 -0
  16. package/dist/commands/cursor-rules.js +13 -207
  17. package/dist/commands/identity.js +3 -3
  18. package/dist/commands/init.js +293 -6
  19. package/dist/commands/onboard-eve-identity.js +1 -1
  20. package/dist/commands/skills-manifest.js +89 -29
  21. package/dist/commands/status.js +52 -50
  22. package/dist/daemon/launchd.js +14 -0
  23. package/dist/entry.js +0 -0
  24. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud +0 -0
  25. package/dist/native/nexus-cloud/darwin-arm64/nexus-cloud-rs +0 -0
  26. package/dist/utils.js +6 -2
  27. package/docs/AGENTS.default.md +1 -1
  28. package/docs/configuration.md +1 -1
  29. package/docs/feature-inventory/overview.md +2 -2
  30. package/docs/reference/templates/AGENTS.md +172 -109
  31. package/docs/templates/AGENTS.md +140 -199
  32. package/docs/templates/BOOTSTRAP.md +40 -20
  33. package/docs/templates/IDENTITY.md +6 -0
  34. package/docs/templates/USER.md +22 -2
  35. package/package.json +3 -1
  36. package/skills/{notion → connectors/notion}/SKILL.md +1 -1
  37. package/skills/{filesystem → guides/filesystem}/SKILL.md +1 -1
  38. package/skills/{onboarding → guides/onboarding}/SKILL.md +1 -1
  39. package/skills/{onboarding → guides/onboarding}/docs/CAPABILITY_TAXONOMY.md +5 -5
  40. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR.md +8 -8
  41. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_ONBOARDING.md +2 -2
  42. package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_SKILLS.md +26 -20
  43. package/skills/{onboarding → guides/onboarding}/docs/GOAL_STATE_ARCHITECTURE.md +38 -43
  44. package/skills/{onboarding → guides/onboarding}/docs/NEXUS_SYSTEM_OVERVIEW.md +4 -4
  45. package/skills/{onboarding → guides/onboarding}/docs/SKILLS_HUB_SPEC.md +1 -1
  46. package/skills/{onboarding → guides/onboarding}/docs/SKILLS_SPECIFICATION.md +8 -7
  47. package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_DESIGN.md +16 -16
  48. package/skills/{onboarding → guides/onboarding}/docs/SKILL_GATEWAY_PRD.md +10 -12
  49. package/skills/guides/onboarding/docs/canonical/00_CONFLICT_ANALYSIS.md +463 -0
  50. package/skills/guides/onboarding/docs/canonical/01_NEXUS_OVERVIEW.md +167 -0
  51. package/skills/guides/onboarding/docs/canonical/02_CLI_REFERENCE.md +404 -0
  52. package/skills/guides/onboarding/docs/canonical/03_STATE_ARCHITECTURE.md +357 -0
  53. package/skills/guides/onboarding/docs/canonical/04_SKILL_SPECIFICATION.md +393 -0
  54. package/skills/guides/onboarding/docs/canonical/05_CAPABILITY_TAXONOMY.md +298 -0
  55. package/skills/guides/onboarding/docs/canonical/06_CAPABILITIES_REFERENCE.md +207 -0
  56. package/skills/guides/onboarding/docs/canonical/07_AGENT_BINDINGS.md +85 -0
  57. package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/nexus-cloud.md +2 -2
  58. package/skills/{onboarding → guides/onboarding}/scripts/ralph/progress.txt +1 -1
  59. package/skills/{nexus-cloud → tools/nexus-cloud}/SKILL.md +2 -1
  60. package/skills/{nexus-cloud → tools/nexus-cloud}/docs/setup.md +1 -1
  61. package/docs/templates/PROFILE.md +0 -14
  62. /package/skills/{brave-search → connectors/brave-search}/SKILL.md +0 -0
  63. /package/skills/{brave-search → connectors/brave-search}/docs/setup.md +0 -0
  64. /package/skills/{brave-search → connectors/brave-search}/docs/troubleshooting.md +0 -0
  65. /package/skills/{brave-search → connectors/brave-search}/docs/usage.md +0 -0
  66. /package/skills/{brave-search → connectors/brave-search}/scripts/content.mjs +0 -0
  67. /package/skills/{brave-search → connectors/brave-search}/scripts/search.mjs +0 -0
  68. /package/skills/{discord → connectors/discord}/SKILL.md +0 -0
  69. /package/skills/{gemini → connectors/gemini}/SKILL.md +0 -0
  70. /package/skills/{github → connectors/github}/SKILL.md +0 -0
  71. /package/skills/{github → connectors/github}/docs/setup.md +0 -0
  72. /package/skills/{github → connectors/github}/docs/troubleshooting.md +0 -0
  73. /package/skills/{google-oauth → connectors/google-oauth}/SKILL.md +0 -0
  74. /package/skills/{slack → connectors/slack}/SKILL.md +0 -0
  75. /package/skills/{telegram → connectors/telegram}/SKILL.md +0 -0
  76. /package/skills/{telegram → connectors/telegram}/docs/pairing.md +0 -0
  77. /package/skills/{telegram → connectors/telegram}/docs/setup.md +0 -0
  78. /package/skills/{telegram → connectors/telegram}/docs/webhook.md +0 -0
  79. /package/skills/{wacli → connectors/wacli}/SKILL.md +0 -0
  80. /package/skills/{wacli → connectors/wacli}/docs/auth.md +0 -0
  81. /package/skills/{wacli → connectors/wacli}/docs/backup.md +0 -0
  82. /package/skills/{wacli → connectors/wacli}/docs/troubleshooting.md +0 -0
  83. /package/skills/{browser-use-agent-sdk → guides/browser-use-agent-sdk}/SKILL.md +0 -0
  84. /package/skills/{json-render → guides/json-render}/SKILL.md +0 -0
  85. /package/skills/{json-render → guides/json-render}/assets/components/README.md +0 -0
  86. /package/skills/{json-render → guides/json-render}/assets/components/catalog.ts +0 -0
  87. /package/skills/{json-render → guides/json-render}/assets/components/registry.tsx +0 -0
  88. /package/skills/{json-render → guides/json-render}/assets/demo/App.css +0 -0
  89. /package/skills/{json-render → guides/json-render}/assets/demo/App.tsx +0 -0
  90. /package/skills/{json-render → guides/json-render}/assets/demo/README.md +0 -0
  91. /package/skills/{json-render → guides/json-render}/assets/demo/catalog.ts +0 -0
  92. /package/skills/{json-render → guides/json-render}/assets/demo/data/nexus-core.json +0 -0
  93. /package/skills/{json-render → guides/json-render}/assets/demo/index.css +0 -0
  94. /package/skills/{json-render → guides/json-render}/assets/demo/registry.tsx +0 -0
  95. /package/skills/{json-render → guides/json-render}/docs/nexus-state-demo.md +0 -0
  96. /package/skills/{json-render → guides/json-render}/docs/shadcn-preset.md +0 -0
  97. /package/skills/{json-render → guides/json-render}/scripts/create-vite-demo.sh +0 -0
  98. /package/skills/{json-render → guides/json-render}/scripts/llm-server/README.md +0 -0
  99. /package/skills/{json-render → guides/json-render}/scripts/llm-server/catalog.ts +0 -0
  100. /package/skills/{json-render → guides/json-render}/scripts/llm-server/package-lock.json +0 -0
  101. /package/skills/{json-render → guides/json-render}/scripts/llm-server/package.json +0 -0
  102. /package/skills/{json-render → guides/json-render}/scripts/llm-server/server.ts +0 -0
  103. /package/skills/{onboarding → guides/onboarding}/docs/CAPABILITIES.md +0 -0
  104. /package/skills/{onboarding → guides/onboarding}/docs/CLI_GRAMMAR_CREDENTIALS.md +0 -0
  105. /package/skills/{onboarding → guides/onboarding}/docs/DOCUMENTATION_OVERVIEW.md +0 -0
  106. /package/skills/{onboarding → guides/onboarding}/docs/ENTITY_MODEL.md +0 -0
  107. /package/skills/{onboarding → guides/onboarding}/docs/SKILL_INVENTORY.md +0 -0
  108. /package/skills/{onboarding → guides/onboarding}/docs/STATE_ARCHITECTURE.md +0 -0
  109. /package/skills/{onboarding → guides/onboarding}/docs/TROUBLESHOOTING.md +0 -0
  110. /package/skills/{onboarding → guides/onboarding}/docs/USER_JOURNEY.md +0 -0
  111. /package/skills/{onboarding → guides/onboarding}/docs/WOW_MOMENTS.md +0 -0
  112. /package/skills/{onboarding → guides/onboarding}/docs/agent-apple-id.md +0 -0
  113. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/1password.md +0 -0
  114. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/TEMPLATE.md +0 -0
  115. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/aix.md +0 -0
  116. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/bird.md +0 -0
  117. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/brave-search.md +0 -0
  118. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/comms.md +0 -0
  119. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/computer-use.md +0 -0
  120. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/cron-and-heartbeat.md +0 -0
  121. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/eve.md +0 -0
  122. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/github.md +0 -0
  123. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/gog.md +0 -0
  124. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/homebrew-prereqs.md +0 -0
  125. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/qmd.md +0 -0
  126. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/telegram.md +0 -0
  127. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/wacli.md +0 -0
  128. /package/skills/{onboarding → guides/onboarding}/docs/skill-deep-dives/weather.md +0 -0
  129. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prd.json +0 -0
  130. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/prompt.md +0 -0
  131. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.log +0 -0
  132. /package/skills/{onboarding → guides/onboarding}/scripts/ralph/ralph.sh +0 -0
  133. /package/skills/{onboarding → guides/onboarding}/scripts/setup-cursor-skills.sh +0 -0
  134. /package/skills/{1password → tools/1password}/SKILL.md +0 -0
  135. /package/skills/{1password → tools/1password}/docs/setup.md +0 -0
  136. /package/skills/{1password → tools/1password}/docs/troubleshooting.md +0 -0
  137. /package/skills/{1password → tools/1password}/references/cli-examples.md +0 -0
  138. /package/skills/{1password → tools/1password}/references/get-started.md +0 -0
  139. /package/skills/{agent-browser → tools/agent-browser}/SKILL.md +0 -0
  140. /package/skills/{agent-browser → tools/agent-browser}/docs/browser-use-eval.md +0 -0
  141. /package/skills/{agent-browser → tools/agent-browser}/docs/first-tests.md +0 -0
  142. /package/skills/{agent-browser → tools/agent-browser}/docs/wordle-nyt-eval.js +0 -0
  143. /package/skills/{aix → tools/aix}/SKILL.md +0 -0
  144. /package/skills/{aix → tools/aix}/docs/embeddings.md +0 -0
  145. /package/skills/{aix → tools/aix}/docs/setup.md +0 -0
  146. /package/skills/{aix → tools/aix}/docs/troubleshooting.md +0 -0
  147. /package/skills/{aix → tools/aix}/references/sql.md +0 -0
  148. /package/skills/{apple-notes → tools/apple-notes}/SKILL.md +0 -0
  149. /package/skills/{apple-reminders → tools/apple-reminders}/SKILL.md +0 -0
  150. /package/skills/{bear-notes → tools/bear-notes}/SKILL.md +0 -0
  151. /package/skills/{bird → tools/bird}/SKILL.md +0 -0
  152. /package/skills/{bird → tools/bird}/docs/auth.md +0 -0
  153. /package/skills/{bird → tools/bird}/docs/troubleshooting.md +0 -0
  154. /package/skills/{blogwatcher → tools/blogwatcher}/SKILL.md +0 -0
  155. /package/skills/{blucli → tools/blucli}/SKILL.md +0 -0
  156. /package/skills/{camsnap → tools/camsnap}/SKILL.md +0 -0
  157. /package/skills/{clawdhub → tools/clawdhub}/SKILL.md +0 -0
  158. /package/skills/{coding-agent → tools/coding-agent}/SKILL.md +0 -0
  159. /package/skills/{comms → tools/comms}/SKILL.md +0 -0
  160. /package/skills/{comms → tools/comms}/docs/adapters.md +0 -0
  161. /package/skills/{comms → tools/comms}/docs/setup.md +0 -0
  162. /package/skills/{comms → tools/comms}/docs/troubleshooting.md +0 -0
  163. /package/skills/{comms → tools/comms}/references/schema.md +0 -0
  164. /package/skills/{computer-use → tools/computer-use}/SKILL.md +0 -0
  165. /package/skills/{computer-use → tools/computer-use}/docs/open-interpreter.md +0 -0
  166. /package/skills/{computer-use → tools/computer-use}/docs/peekaboo.md +0 -0
  167. /package/skills/{computer-use → tools/computer-use}/docs/setup.md +0 -0
  168. /package/skills/{computer-use → tools/computer-use}/docs/troubleshooting.md +0 -0
  169. /package/skills/{eightctl → tools/eightctl}/SKILL.md +0 -0
  170. /package/skills/{eve → tools/eve}/SKILL.md +0 -0
  171. /package/skills/{eve → tools/eve}/docs/dual-account.md +0 -0
  172. /package/skills/{eve → tools/eve}/docs/intelligence.md +0 -0
  173. /package/skills/{eve → tools/eve}/docs/setup.md +0 -0
  174. /package/skills/{eve → tools/eve}/docs/troubleshooting.md +0 -0
  175. /package/skills/{eve → tools/eve}/scripts/setup-dual-account.sh +0 -0
  176. /package/skills/{food-order → tools/food-order}/SKILL.md +0 -0
  177. /package/skills/{gh → tools/gh}/SKILL.md +0 -0
  178. /package/skills/{gh → tools/gh}/docs/usage.md +0 -0
  179. /package/skills/{gifgrep → tools/gifgrep}/SKILL.md +0 -0
  180. /package/skills/{gog → tools/gog}/SKILL.md +0 -0
  181. /package/skills/{gog → tools/gog}/docs/portability.md +0 -0
  182. /package/skills/{gog → tools/gog}/docs/setup.md +0 -0
  183. /package/skills/{gog → tools/gog}/docs/troubleshooting.md +0 -0
  184. /package/skills/{gog → tools/gog}/scripts/cdp/README.md +0 -0
  185. /package/skills/{gog → tools/gog}/scripts/cdp/add_test_users.py +0 -0
  186. /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts.py +0 -0
  187. /package/skills/{gog → tools/gog}/scripts/cdp/auth_add_accounts_manual.py +0 -0
  188. /package/skills/{gog → tools/gog}/scripts/cdp/create_oauth_client.py +0 -0
  189. /package/skills/{gog → tools/gog}/scripts/cdp/launch_cdp_chrome.sh +0 -0
  190. /package/skills/{goplaces → tools/goplaces}/SKILL.md +0 -0
  191. /package/skills/{imsg → tools/imsg}/SKILL.md +0 -0
  192. /package/skills/{local-places → tools/local-places}/SERVER_README.md +0 -0
  193. /package/skills/{local-places → tools/local-places}/SKILL.md +0 -0
  194. /package/skills/{local-places → tools/local-places}/pyproject.toml +0 -0
  195. /package/skills/{local-places → tools/local-places}/src/local_places/__init__.py +0 -0
  196. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/__init__.cpython-314.pyc +0 -0
  197. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/google_places.cpython-314.pyc +0 -0
  198. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/main.cpython-314.pyc +0 -0
  199. /package/skills/{local-places → tools/local-places}/src/local_places/__pycache__/schemas.cpython-314.pyc +0 -0
  200. /package/skills/{local-places → tools/local-places}/src/local_places/google_places.py +0 -0
  201. /package/skills/{local-places → tools/local-places}/src/local_places/main.py +0 -0
  202. /package/skills/{local-places → tools/local-places}/src/local_places/schemas.py +0 -0
  203. /package/skills/{mcporter → tools/mcporter}/SKILL.md +0 -0
  204. /package/skills/{model-usage → tools/model-usage}/SKILL.md +0 -0
  205. /package/skills/{model-usage → tools/model-usage}/references/codexbar-cli.md +0 -0
  206. /package/skills/{model-usage → tools/model-usage}/scripts/model_usage.py +0 -0
  207. /package/skills/{nano-banana-pro → tools/nano-banana-pro}/SKILL.md +0 -0
  208. /package/skills/{nano-banana-pro → tools/nano-banana-pro}/scripts/generate_image.py +0 -0
  209. /package/skills/{nano-pdf → tools/nano-pdf}/SKILL.md +0 -0
  210. /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/security.md +0 -0
  211. /package/skills/{nexus-cloud → tools/nexus-cloud}/docs/troubleshooting.md +0 -0
  212. /package/skills/{obsidian → tools/obsidian}/SKILL.md +0 -0
  213. /package/skills/{openai-image-gen → tools/openai-image-gen}/SKILL.md +0 -0
  214. /package/skills/{openai-image-gen → tools/openai-image-gen}/scripts/gen.py +0 -0
  215. /package/skills/{openai-whisper → tools/openai-whisper}/SKILL.md +0 -0
  216. /package/skills/{openai-whisper-api → tools/openai-whisper-api}/SKILL.md +0 -0
  217. /package/skills/{openai-whisper-api → tools/openai-whisper-api}/scripts/transcribe.sh +0 -0
  218. /package/skills/{openhue → tools/openhue}/SKILL.md +0 -0
  219. /package/skills/{oracle → tools/oracle}/SKILL.md +0 -0
  220. /package/skills/{ordercli → tools/ordercli}/SKILL.md +0 -0
  221. /package/skills/{peekaboo → tools/peekaboo}/SKILL.md +0 -0
  222. /package/skills/{qmd → tools/qmd}/SKILL.md +0 -0
  223. /package/skills/{qmd → tools/qmd}/docs/mcp.md +0 -0
  224. /package/skills/{qmd → tools/qmd}/docs/ollama.md +0 -0
  225. /package/skills/{qmd → tools/qmd}/docs/setup.md +0 -0
  226. /package/skills/{sag → tools/sag}/SKILL.md +0 -0
  227. /package/skills/{skill-cli-template → tools/skill-cli-template}/SKILL.md +0 -0
  228. /package/skills/{songsee → tools/songsee}/SKILL.md +0 -0
  229. /package/skills/{sonoscli → tools/sonoscli}/SKILL.md +0 -0
  230. /package/skills/{spotify-player → tools/spotify-player}/SKILL.md +0 -0
  231. /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
  232. /package/skills/{things-mac → tools/things-mac}/SKILL.md +0 -0
  233. /package/skills/{tmux → tools/tmux}/SKILL.md +0 -0
  234. /package/skills/{tmux → tools/tmux}/scripts/find-sessions.sh +0 -0
  235. /package/skills/{tmux → tools/tmux}/scripts/wait-for-text.sh +0 -0
  236. /package/skills/{trello → tools/trello}/SKILL.md +0 -0
  237. /package/skills/{upstream-sync → tools/upstream-sync}/SKILL.md +0 -0
  238. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/auto-port.sh +0 -0
  239. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-all.sh +0 -0
  240. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-nexus.sh +0 -0
  241. /package/skills/{upstream-sync → tools/upstream-sync}/scripts/check-pi-ai.sh +0 -0
  242. /package/skills/{video-frames → tools/video-frames}/SKILL.md +0 -0
  243. /package/skills/{video-frames → tools/video-frames}/scripts/frame.sh +0 -0
  244. /package/skills/{weather → tools/weather}/SKILL.md +0 -0
  245. /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 { MANAGED_SKILLS_DIR } from "../utils.js";
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
- result[key] = value;
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 entries = await fsp.readdir(bundledDir, { withFileTypes: true });
117
- for (const entry of entries) {
118
- if (!entry.isDirectory())
119
- continue;
120
- if (entry.name.startsWith("."))
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
- // Skills user installs via NexusHub go in a managed/ subfolder or directly
208
+ // Managed skills live under ~/nexus/skills/managed/
149
209
  // User skills are in ~/nexus/home/skills/
150
- const bundledSkills = await scanSkillsDir(skillsDir, "bundled");
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 scanSkillsDir(managedDir, "managed")
214
+ ? await scanSkillRoots(managedDir, "managed")
155
215
  : {};
156
216
  // User skills from workspace
157
217
  const userSkills = userSkillsDir
158
- ? await scanSkillsDir(userSkillsDir, "user")
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(MANAGED_SKILLS_DIR, "manifest.json");
241
+ return path.join(SKILLS_STATE_DIR, "manifest.json");
182
242
  }
183
243
  /**
184
244
  * Write the skill manifest to disk
@@ -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 PROFILE.md, IDENTITY.md, SOUL.md, and MEMORY.md as you learn them.
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.userProfilePath}`);
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
- runtime.log(` → ${identity.agentMemoryPath}`);
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
- const services = Object.entries(credentials.services ?? {});
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
- for (const [service, info] of services) {
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
- runtime.log(`\n🎯 Capabilities (${capabilitySnapshot.summary.active}/${capabilitySnapshot.summary.total} active)`);
181
- for (const [category, _entries] of Object.entries(capabilitySnapshot.registry.categories)) {
182
- const categoryCaps = capabilitySnapshot.capabilities.filter((cap) => cap.category === category);
183
- const activeCount = categoryCaps.filter((cap) => cap.status === "active").length;
184
- if (categoryCaps.length === 0)
185
- continue;
186
- runtime.log(` ${category} (${activeCount}/${categoryCaps.length})`);
187
- const sample = categoryCaps.slice(0, 3);
188
- for (const cap of sample) {
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}: ${providers || cap.providersRaw}`);
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
- if (suggestions.length > 0) {
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 suggestions) {
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() {
@@ -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
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
- // Managed skills directory lives under state/
154
- export const MANAGED_SKILLS_DIR = path.join(resolveStateDir(), "skills");
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;
@@ -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}/identity/SOUL.md`, `state/user/identity/PROFILE.md`, and today+yesterday in `home/memory/`.
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)
@@ -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`, `PROFILE.md`, and `BOOTSTRAP.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/run/verify/stats`
36
+ - `nexus skill list/info/use/verify/stats`
37
37
 
38
38
  ### Skills Hub (Remote)
39
39
  - `nexus skills search/publish/install`