@moreih29/nexus-core 0.17.0 → 0.18.2

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 (415) hide show
  1. package/README.md +101 -67
  2. package/dist/cli/sync.d.ts +3 -0
  3. package/dist/cli/sync.d.ts.map +1 -0
  4. package/dist/cli/sync.js +59 -0
  5. package/dist/cli/sync.js.map +1 -0
  6. package/dist/generate/index.d.ts +3 -0
  7. package/dist/generate/index.d.ts.map +1 -0
  8. package/dist/generate/index.js +2 -0
  9. package/dist/generate/index.js.map +1 -0
  10. package/dist/generate/load-data.d.ts +8 -0
  11. package/dist/generate/load-data.d.ts.map +1 -0
  12. package/dist/generate/load-data.js +45 -0
  13. package/dist/generate/load-data.js.map +1 -0
  14. package/dist/generate/load-spec.d.ts +3 -0
  15. package/dist/generate/load-spec.d.ts.map +1 -0
  16. package/dist/generate/load-spec.js +48 -0
  17. package/dist/generate/load-spec.js.map +1 -0
  18. package/dist/generate/macros/expand.d.ts +3 -0
  19. package/dist/generate/macros/expand.d.ts.map +1 -0
  20. package/dist/generate/macros/expand.js +48 -0
  21. package/dist/generate/macros/expand.js.map +1 -0
  22. package/dist/generate/macros/parse.d.ts +4 -0
  23. package/dist/generate/macros/parse.d.ts.map +1 -0
  24. package/dist/generate/macros/parse.js +142 -0
  25. package/dist/generate/macros/parse.js.map +1 -0
  26. package/dist/generate/macros/validate.d.ts +3 -0
  27. package/dist/generate/macros/validate.d.ts.map +1 -0
  28. package/dist/generate/macros/validate.js +23 -0
  29. package/dist/generate/macros/validate.js.map +1 -0
  30. package/dist/generate/renderers/claude.d.ts +3 -0
  31. package/dist/generate/renderers/claude.d.ts.map +1 -0
  32. package/dist/generate/renderers/claude.js +48 -0
  33. package/dist/generate/renderers/claude.js.map +1 -0
  34. package/dist/generate/renderers/codex.d.ts +3 -0
  35. package/dist/generate/renderers/codex.d.ts.map +1 -0
  36. package/dist/generate/renderers/codex.js +79 -0
  37. package/dist/generate/renderers/codex.js.map +1 -0
  38. package/dist/generate/renderers/markdown.d.ts +2 -0
  39. package/dist/generate/renderers/markdown.d.ts.map +1 -0
  40. package/dist/generate/renderers/markdown.js +6 -0
  41. package/dist/generate/renderers/markdown.js.map +1 -0
  42. package/dist/generate/renderers/opencode.d.ts +3 -0
  43. package/dist/generate/renderers/opencode.d.ts.map +1 -0
  44. package/dist/generate/renderers/opencode.js +69 -0
  45. package/dist/generate/renderers/opencode.js.map +1 -0
  46. package/dist/generate/sync.d.ts +4 -0
  47. package/dist/generate/sync.d.ts.map +1 -0
  48. package/dist/generate/sync.js +60 -0
  49. package/dist/generate/sync.js.map +1 -0
  50. package/dist/generate/types.d.ts +74 -0
  51. package/dist/generate/types.d.ts.map +1 -0
  52. package/dist/generate/types.js +2 -0
  53. package/dist/generate/types.js.map +1 -0
  54. package/dist/index.d.ts +4 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +2 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/mcp/definitions/artifact.d.ts +20 -0
  59. package/dist/mcp/definitions/artifact.d.ts.map +1 -0
  60. package/dist/mcp/definitions/artifact.js +14 -0
  61. package/dist/mcp/definitions/artifact.js.map +1 -0
  62. package/dist/mcp/definitions/history.d.ts +20 -0
  63. package/dist/mcp/definitions/history.d.ts.map +1 -0
  64. package/dist/mcp/definitions/history.js +18 -0
  65. package/dist/mcp/definitions/history.js.map +1 -0
  66. package/dist/mcp/definitions/index.d.ts +276 -0
  67. package/dist/mcp/definitions/index.d.ts.map +1 -0
  68. package/dist/mcp/definitions/index.js +16 -0
  69. package/dist/mcp/definitions/index.js.map +1 -0
  70. package/dist/mcp/definitions/plan.d.ts +111 -0
  71. package/dist/mcp/definitions/plan.d.ts.map +1 -0
  72. package/dist/mcp/definitions/plan.js +89 -0
  73. package/dist/mcp/definitions/plan.js.map +1 -0
  74. package/dist/mcp/definitions/task.d.ts +138 -0
  75. package/dist/mcp/definitions/task.d.ts.map +1 -0
  76. package/dist/mcp/definitions/task.js +78 -0
  77. package/dist/mcp/definitions/task.js.map +1 -0
  78. package/dist/mcp/handlers/artifact.d.ts.map +1 -0
  79. package/dist/mcp/handlers/artifact.js +42 -0
  80. package/dist/mcp/handlers/artifact.js.map +1 -0
  81. package/dist/mcp/handlers/history.d.ts.map +1 -0
  82. package/dist/mcp/handlers/history.js +35 -0
  83. package/dist/mcp/handlers/history.js.map +1 -0
  84. package/dist/mcp/handlers/plan.d.ts.map +1 -0
  85. package/dist/mcp/handlers/plan.js +324 -0
  86. package/dist/mcp/handlers/plan.js.map +1 -0
  87. package/dist/mcp/handlers/task.d.ts.map +1 -0
  88. package/dist/mcp/handlers/task.js +216 -0
  89. package/dist/mcp/handlers/task.js.map +1 -0
  90. package/dist/{src/mcp → mcp}/server.d.ts +1 -1
  91. package/dist/mcp/server.d.ts.map +1 -0
  92. package/dist/mcp/server.js +58 -0
  93. package/dist/mcp/server.js.map +1 -0
  94. package/dist/shared/json-store.d.ts.map +1 -0
  95. package/dist/{src/shared → shared}/json-store.js +5 -4
  96. package/dist/shared/json-store.js.map +1 -0
  97. package/dist/shared/mcp-utils.d.ts.map +1 -0
  98. package/dist/shared/mcp-utils.js.map +1 -0
  99. package/dist/{src/shared → shared}/paths.d.ts +0 -6
  100. package/dist/shared/paths.d.ts.map +1 -0
  101. package/dist/shared/paths.js +62 -0
  102. package/dist/shared/paths.js.map +1 -0
  103. package/dist/shared/register-tool.d.ts +20 -0
  104. package/dist/shared/register-tool.d.ts.map +1 -0
  105. package/dist/shared/register-tool.js +15 -0
  106. package/dist/shared/register-tool.js.map +1 -0
  107. package/dist/{src/types → types}/state.d.ts +65 -65
  108. package/dist/types/state.d.ts.map +1 -0
  109. package/dist/{src/types → types}/state.js +1 -1
  110. package/dist/types/state.js.map +1 -0
  111. package/harness/claude/agent-rules.yml +21 -0
  112. package/harness/claude/invocations.yml +11 -0
  113. package/harness/claude/layout.yml +3 -0
  114. package/harness/codex/agent-rules.yml +28 -0
  115. package/harness/codex/invocations.yml +13 -0
  116. package/harness/codex/layout.yml +3 -0
  117. package/harness/opencode/agent-rules.yml +18 -0
  118. package/harness/opencode/invocations.yml +12 -0
  119. package/harness/opencode/layout.yml +3 -0
  120. package/package.json +38 -43
  121. package/{assets → spec}/agents/architect/body.ko.md +92 -84
  122. package/spec/agents/architect/body.md +185 -0
  123. package/spec/agents/designer/body.ko.md +330 -0
  124. package/spec/agents/designer/body.md +330 -0
  125. package/spec/agents/engineer/body.ko.md +166 -0
  126. package/spec/agents/engineer/body.md +166 -0
  127. package/spec/agents/lead/body.ko.md +276 -0
  128. package/spec/agents/lead/body.md +276 -0
  129. package/{assets → spec}/agents/postdoc/body.ko.md +116 -46
  130. package/spec/agents/postdoc/body.md +192 -0
  131. package/{assets → spec}/agents/researcher/body.ko.md +131 -45
  132. package/spec/agents/researcher/body.md +223 -0
  133. package/spec/agents/reviewer/body.ko.md +219 -0
  134. package/spec/agents/reviewer/body.md +219 -0
  135. package/{assets → spec}/agents/strategist/body.ko.md +108 -35
  136. package/spec/agents/strategist/body.md +187 -0
  137. package/spec/agents/tester/body.ko.md +272 -0
  138. package/spec/agents/tester/body.md +272 -0
  139. package/{assets → spec}/agents/writer/body.ko.md +109 -33
  140. package/spec/agents/writer/body.md +198 -0
  141. package/spec/skills/nx-auto-plan/body.ko.md +150 -0
  142. package/spec/skills/nx-auto-plan/body.md +150 -0
  143. package/spec/skills/nx-plan/body.ko.md +159 -0
  144. package/spec/skills/nx-plan/body.md +159 -0
  145. package/spec/skills/nx-run/body.ko.md +132 -0
  146. package/spec/skills/nx-run/body.md +132 -0
  147. package/vocabulary/enums/task-register-state.yml +4 -0
  148. package/vocabulary/invocations.yml +43 -0
  149. package/assets/agents/architect/body.md +0 -177
  150. package/assets/agents/designer/body.ko.md +0 -125
  151. package/assets/agents/designer/body.md +0 -125
  152. package/assets/agents/engineer/body.ko.md +0 -106
  153. package/assets/agents/engineer/body.md +0 -106
  154. package/assets/agents/lead/body.ko.md +0 -70
  155. package/assets/agents/lead/body.md +0 -70
  156. package/assets/agents/postdoc/body.md +0 -122
  157. package/assets/agents/researcher/body.md +0 -137
  158. package/assets/agents/reviewer/body.ko.md +0 -138
  159. package/assets/agents/reviewer/body.md +0 -138
  160. package/assets/agents/strategist/body.md +0 -116
  161. package/assets/agents/tester/body.ko.md +0 -195
  162. package/assets/agents/tester/body.md +0 -195
  163. package/assets/agents/writer/body.md +0 -122
  164. package/assets/capability-matrix.yml +0 -200
  165. package/assets/hooks/agent-bootstrap/handler.test.ts +0 -369
  166. package/assets/hooks/agent-bootstrap/handler.ts +0 -132
  167. package/assets/hooks/agent-bootstrap/meta.yml +0 -10
  168. package/assets/hooks/agent-finalize/handler.test.ts +0 -368
  169. package/assets/hooks/agent-finalize/handler.ts +0 -76
  170. package/assets/hooks/agent-finalize/meta.yml +0 -10
  171. package/assets/hooks/capability-matrix.yml +0 -313
  172. package/assets/hooks/post-tool-telemetry/handler.test.ts +0 -302
  173. package/assets/hooks/post-tool-telemetry/handler.ts +0 -49
  174. package/assets/hooks/post-tool-telemetry/meta.yml +0 -10
  175. package/assets/hooks/prompt-router/handler.test.ts +0 -801
  176. package/assets/hooks/prompt-router/handler.ts +0 -272
  177. package/assets/hooks/prompt-router/meta.yml +0 -11
  178. package/assets/hooks/session-init/handler.test.ts +0 -274
  179. package/assets/hooks/session-init/handler.ts +0 -31
  180. package/assets/hooks/session-init/meta.yml +0 -9
  181. package/assets/lsp-servers.json +0 -55
  182. package/assets/schema/lsp-servers.schema.json +0 -67
  183. package/assets/skills/nx-init/body.ko.md +0 -197
  184. package/assets/skills/nx-init/body.md +0 -197
  185. package/assets/skills/nx-plan/body.ko.md +0 -361
  186. package/assets/skills/nx-plan/body.md +0 -361
  187. package/assets/skills/nx-run/body.ko.md +0 -161
  188. package/assets/skills/nx-run/body.md +0 -160
  189. package/assets/skills/nx-sync/body.ko.md +0 -92
  190. package/assets/skills/nx-sync/body.md +0 -92
  191. package/assets/tools/tool-name-map.yml +0 -353
  192. package/dist/assets/hooks/agent-bootstrap/handler.d.ts +0 -4
  193. package/dist/assets/hooks/agent-bootstrap/handler.d.ts.map +0 -1
  194. package/dist/assets/hooks/agent-bootstrap/handler.js +0 -114
  195. package/dist/assets/hooks/agent-bootstrap/handler.js.map +0 -1
  196. package/dist/assets/hooks/agent-finalize/handler.d.ts +0 -4
  197. package/dist/assets/hooks/agent-finalize/handler.d.ts.map +0 -1
  198. package/dist/assets/hooks/agent-finalize/handler.js +0 -63
  199. package/dist/assets/hooks/agent-finalize/handler.js.map +0 -1
  200. package/dist/assets/hooks/post-tool-telemetry/handler.d.ts +0 -4
  201. package/dist/assets/hooks/post-tool-telemetry/handler.d.ts.map +0 -1
  202. package/dist/assets/hooks/post-tool-telemetry/handler.js +0 -40
  203. package/dist/assets/hooks/post-tool-telemetry/handler.js.map +0 -1
  204. package/dist/assets/hooks/prompt-router/handler.d.ts +0 -4
  205. package/dist/assets/hooks/prompt-router/handler.d.ts.map +0 -1
  206. package/dist/assets/hooks/prompt-router/handler.js +0 -214
  207. package/dist/assets/hooks/prompt-router/handler.js.map +0 -1
  208. package/dist/assets/hooks/session-init/handler.d.ts +0 -4
  209. package/dist/assets/hooks/session-init/handler.d.ts.map +0 -1
  210. package/dist/assets/hooks/session-init/handler.js +0 -22
  211. package/dist/assets/hooks/session-init/handler.js.map +0 -1
  212. package/dist/claude/.claude-plugin/marketplace.json +0 -75
  213. package/dist/claude/.claude-plugin/plugin.json +0 -67
  214. package/dist/claude/agents/architect.md +0 -172
  215. package/dist/claude/agents/designer.md +0 -120
  216. package/dist/claude/agents/engineer.md +0 -98
  217. package/dist/claude/agents/lead.md +0 -59
  218. package/dist/claude/agents/postdoc.md +0 -117
  219. package/dist/claude/agents/researcher.md +0 -132
  220. package/dist/claude/agents/reviewer.md +0 -133
  221. package/dist/claude/agents/strategist.md +0 -111
  222. package/dist/claude/agents/tester.md +0 -190
  223. package/dist/claude/agents/writer.md +0 -114
  224. package/dist/claude/dist/hooks/agent-bootstrap.js +0 -238
  225. package/dist/claude/dist/hooks/agent-finalize.js +0 -180
  226. package/dist/claude/dist/hooks/post-tool-telemetry.js +0 -71
  227. package/dist/claude/dist/hooks/prompt-router.js +0 -7336
  228. package/dist/claude/dist/hooks/session-init.js +0 -50
  229. package/dist/claude/hooks/hooks.json +0 -64
  230. package/dist/claude/settings.json +0 -3
  231. package/dist/claude/skills/nx-init/SKILL.md +0 -189
  232. package/dist/claude/skills/nx-plan/SKILL.md +0 -353
  233. package/dist/claude/skills/nx-run/SKILL.md +0 -154
  234. package/dist/claude/skills/nx-sync/SKILL.md +0 -87
  235. package/dist/codex/agents/architect.toml +0 -175
  236. package/dist/codex/agents/designer.toml +0 -123
  237. package/dist/codex/agents/engineer.toml +0 -105
  238. package/dist/codex/agents/lead.toml +0 -64
  239. package/dist/codex/agents/postdoc.toml +0 -120
  240. package/dist/codex/agents/researcher.toml +0 -136
  241. package/dist/codex/agents/reviewer.toml +0 -137
  242. package/dist/codex/agents/strategist.toml +0 -114
  243. package/dist/codex/agents/tester.toml +0 -194
  244. package/dist/codex/agents/writer.toml +0 -121
  245. package/dist/codex/dist/hooks/agent-bootstrap.js +0 -238
  246. package/dist/codex/dist/hooks/agent-finalize.js +0 -180
  247. package/dist/codex/dist/hooks/prompt-router.js +0 -7336
  248. package/dist/codex/dist/hooks/session-init.js +0 -50
  249. package/dist/codex/hooks/hooks.json +0 -28
  250. package/dist/codex/install/AGENTS.fragment.md +0 -60
  251. package/dist/codex/install/config.fragment.toml +0 -5
  252. package/dist/codex/install/install.sh +0 -60
  253. package/dist/codex/package.json +0 -20
  254. package/dist/codex/plugin/.codex-plugin/plugin.json +0 -57
  255. package/dist/codex/plugin/skills/nx-init/SKILL.md +0 -189
  256. package/dist/codex/plugin/skills/nx-plan/SKILL.md +0 -353
  257. package/dist/codex/plugin/skills/nx-run/SKILL.md +0 -154
  258. package/dist/codex/plugin/skills/nx-sync/SKILL.md +0 -87
  259. package/dist/codex/prompts/architect.md +0 -166
  260. package/dist/codex/prompts/designer.md +0 -114
  261. package/dist/codex/prompts/engineer.md +0 -97
  262. package/dist/codex/prompts/lead.md +0 -60
  263. package/dist/codex/prompts/postdoc.md +0 -111
  264. package/dist/codex/prompts/researcher.md +0 -127
  265. package/dist/codex/prompts/reviewer.md +0 -128
  266. package/dist/codex/prompts/strategist.md +0 -105
  267. package/dist/codex/prompts/tester.md +0 -185
  268. package/dist/codex/prompts/writer.md +0 -113
  269. package/dist/hooks/agent-bootstrap.js +0 -238
  270. package/dist/hooks/agent-finalize.js +0 -180
  271. package/dist/hooks/post-tool-telemetry.js +0 -71
  272. package/dist/hooks/prompt-router.js +0 -7336
  273. package/dist/hooks/session-init.js +0 -50
  274. package/dist/manifests/claude-hooks.json +0 -64
  275. package/dist/manifests/codex-hooks.json +0 -28
  276. package/dist/manifests/opencode-manifest.json +0 -54
  277. package/dist/manifests/portability-report.json +0 -75
  278. package/dist/opencode/.opencode/skills/nx-init/SKILL.md +0 -189
  279. package/dist/opencode/.opencode/skills/nx-plan/SKILL.md +0 -353
  280. package/dist/opencode/.opencode/skills/nx-run/SKILL.md +0 -154
  281. package/dist/opencode/.opencode/skills/nx-sync/SKILL.md +0 -87
  282. package/dist/opencode/package.json +0 -23
  283. package/dist/opencode/src/agents/architect.ts +0 -176
  284. package/dist/opencode/src/agents/designer.ts +0 -124
  285. package/dist/opencode/src/agents/engineer.ts +0 -105
  286. package/dist/opencode/src/agents/lead.ts +0 -66
  287. package/dist/opencode/src/agents/postdoc.ts +0 -121
  288. package/dist/opencode/src/agents/researcher.ts +0 -136
  289. package/dist/opencode/src/agents/reviewer.ts +0 -137
  290. package/dist/opencode/src/agents/strategist.ts +0 -115
  291. package/dist/opencode/src/agents/tester.ts +0 -194
  292. package/dist/opencode/src/agents/writer.ts +0 -121
  293. package/dist/opencode/src/index.ts +0 -25
  294. package/dist/opencode/src/plugin.ts +0 -6
  295. package/dist/scripts/build-agents.d.ts +0 -170
  296. package/dist/scripts/build-agents.d.ts.map +0 -1
  297. package/dist/scripts/build-agents.js +0 -907
  298. package/dist/scripts/build-agents.js.map +0 -1
  299. package/dist/scripts/build-hooks.d.ts +0 -57
  300. package/dist/scripts/build-hooks.d.ts.map +0 -1
  301. package/dist/scripts/build-hooks.js +0 -562
  302. package/dist/scripts/build-hooks.js.map +0 -1
  303. package/dist/scripts/cli.d.ts +0 -54
  304. package/dist/scripts/cli.d.ts.map +0 -1
  305. package/dist/scripts/cli.js +0 -504
  306. package/dist/scripts/cli.js.map +0 -1
  307. package/dist/scripts/smoke/smoke-claude.d.ts +0 -2
  308. package/dist/scripts/smoke/smoke-claude.d.ts.map +0 -1
  309. package/dist/scripts/smoke/smoke-claude.js +0 -58
  310. package/dist/scripts/smoke/smoke-claude.js.map +0 -1
  311. package/dist/scripts/smoke/smoke-codex.d.ts +0 -2
  312. package/dist/scripts/smoke/smoke-codex.d.ts.map +0 -1
  313. package/dist/scripts/smoke/smoke-codex.js +0 -50
  314. package/dist/scripts/smoke/smoke-codex.js.map +0 -1
  315. package/dist/scripts/smoke/smoke-consumer.d.ts +0 -2
  316. package/dist/scripts/smoke/smoke-consumer.d.ts.map +0 -1
  317. package/dist/scripts/smoke/smoke-consumer.js +0 -230
  318. package/dist/scripts/smoke/smoke-consumer.js.map +0 -1
  319. package/dist/scripts/smoke/smoke-opencode.d.ts +0 -2
  320. package/dist/scripts/smoke/smoke-opencode.d.ts.map +0 -1
  321. package/dist/scripts/smoke/smoke-opencode.js +0 -99
  322. package/dist/scripts/smoke/smoke-opencode.js.map +0 -1
  323. package/dist/src/hooks/opencode-mount.d.ts +0 -35
  324. package/dist/src/hooks/opencode-mount.d.ts.map +0 -1
  325. package/dist/src/hooks/opencode-mount.js +0 -352
  326. package/dist/src/hooks/opencode-mount.js.map +0 -1
  327. package/dist/src/hooks/runtime.d.ts +0 -37
  328. package/dist/src/hooks/runtime.d.ts.map +0 -1
  329. package/dist/src/hooks/runtime.js +0 -274
  330. package/dist/src/hooks/runtime.js.map +0 -1
  331. package/dist/src/hooks/types.d.ts +0 -196
  332. package/dist/src/hooks/types.d.ts.map +0 -1
  333. package/dist/src/hooks/types.js +0 -85
  334. package/dist/src/hooks/types.js.map +0 -1
  335. package/dist/src/lsp/cache.d.ts +0 -9
  336. package/dist/src/lsp/cache.d.ts.map +0 -1
  337. package/dist/src/lsp/cache.js +0 -216
  338. package/dist/src/lsp/cache.js.map +0 -1
  339. package/dist/src/lsp/client.d.ts +0 -24
  340. package/dist/src/lsp/client.d.ts.map +0 -1
  341. package/dist/src/lsp/client.js +0 -166
  342. package/dist/src/lsp/client.js.map +0 -1
  343. package/dist/src/lsp/detect.d.ts +0 -77
  344. package/dist/src/lsp/detect.d.ts.map +0 -1
  345. package/dist/src/lsp/detect.js +0 -116
  346. package/dist/src/lsp/detect.js.map +0 -1
  347. package/dist/src/mcp/server.d.ts.map +0 -1
  348. package/dist/src/mcp/server.js +0 -34
  349. package/dist/src/mcp/server.js.map +0 -1
  350. package/dist/src/mcp/tools/artifact.d.ts.map +0 -1
  351. package/dist/src/mcp/tools/artifact.js +0 -36
  352. package/dist/src/mcp/tools/artifact.js.map +0 -1
  353. package/dist/src/mcp/tools/history.d.ts.map +0 -1
  354. package/dist/src/mcp/tools/history.js +0 -29
  355. package/dist/src/mcp/tools/history.js.map +0 -1
  356. package/dist/src/mcp/tools/lsp.d.ts +0 -13
  357. package/dist/src/mcp/tools/lsp.d.ts.map +0 -1
  358. package/dist/src/mcp/tools/lsp.js +0 -225
  359. package/dist/src/mcp/tools/lsp.js.map +0 -1
  360. package/dist/src/mcp/tools/plan.d.ts.map +0 -1
  361. package/dist/src/mcp/tools/plan.js +0 -317
  362. package/dist/src/mcp/tools/plan.js.map +0 -1
  363. package/dist/src/mcp/tools/task.d.ts.map +0 -1
  364. package/dist/src/mcp/tools/task.js +0 -252
  365. package/dist/src/mcp/tools/task.js.map +0 -1
  366. package/dist/src/shared/invocations.d.ts +0 -74
  367. package/dist/src/shared/invocations.d.ts.map +0 -1
  368. package/dist/src/shared/invocations.js +0 -247
  369. package/dist/src/shared/invocations.js.map +0 -1
  370. package/dist/src/shared/json-store.d.ts.map +0 -1
  371. package/dist/src/shared/json-store.js.map +0 -1
  372. package/dist/src/shared/mcp-utils.d.ts.map +0 -1
  373. package/dist/src/shared/mcp-utils.js.map +0 -1
  374. package/dist/src/shared/package-root.d.ts +0 -6
  375. package/dist/src/shared/package-root.d.ts.map +0 -1
  376. package/dist/src/shared/package-root.js +0 -19
  377. package/dist/src/shared/package-root.js.map +0 -1
  378. package/dist/src/shared/paths.d.ts.map +0 -1
  379. package/dist/src/shared/paths.js +0 -117
  380. package/dist/src/shared/paths.js.map +0 -1
  381. package/dist/src/shared/tool-log.d.ts +0 -8
  382. package/dist/src/shared/tool-log.d.ts.map +0 -1
  383. package/dist/src/shared/tool-log.js +0 -22
  384. package/dist/src/shared/tool-log.js.map +0 -1
  385. package/dist/src/types/agent-config.d.ts +0 -22
  386. package/dist/src/types/agent-config.d.ts.map +0 -1
  387. package/dist/src/types/agent-config.js +0 -2
  388. package/dist/src/types/agent-config.js.map +0 -1
  389. package/dist/src/types/index.d.ts +0 -2
  390. package/dist/src/types/index.d.ts.map +0 -1
  391. package/dist/src/types/index.js +0 -2
  392. package/dist/src/types/index.js.map +0 -1
  393. package/dist/src/types/state.d.ts.map +0 -1
  394. package/dist/src/types/state.js.map +0 -1
  395. package/docs/consuming/codex-lead-merge.md +0 -106
  396. package/docs/contract/harness-io.md +0 -333
  397. package/docs/plugin-guide.md +0 -355
  398. package/docs/plugin-template/claude/.github/workflows/build.yml +0 -60
  399. package/docs/plugin-template/claude/README.md +0 -110
  400. package/docs/plugin-template/claude/package.json +0 -16
  401. package/docs/plugin-template/codex/.github/workflows/build.yml +0 -51
  402. package/docs/plugin-template/codex/README.md +0 -147
  403. package/docs/plugin-template/codex/install/install.sh +0 -60
  404. package/docs/plugin-template/codex/package.json +0 -17
  405. package/docs/plugin-template/opencode/.github/workflows/build.yml +0 -61
  406. package/docs/plugin-template/opencode/README.md +0 -121
  407. package/docs/plugin-template/opencode/package.json +0 -25
  408. package/docs/plugin-template/opencode/src/plugin.ts +0 -6
  409. /package/dist/{src/mcp/tools → mcp/handlers}/artifact.d.ts +0 -0
  410. /package/dist/{src/mcp/tools → mcp/handlers}/history.d.ts +0 -0
  411. /package/dist/{src/mcp/tools → mcp/handlers}/plan.d.ts +0 -0
  412. /package/dist/{src/mcp/tools → mcp/handlers}/task.d.ts +0 -0
  413. /package/dist/{src/shared → shared}/json-store.d.ts +0 -0
  414. /package/dist/{src/shared → shared}/mcp-utils.d.ts +0 -0
  415. /package/dist/{src/shared → shared}/mcp-utils.js +0 -0
@@ -1,369 +0,0 @@
1
- /**
2
- * agent-bootstrap handler tests
3
- *
4
- * Scenarios:
5
- * (1) fresh + registered role (assets/agents/architect exists) → additional_context contains core index + rules
6
- * (2) fresh + unregistered role ("general") → silent skip (no additional_context)
7
- * (3) resume_count > 0 → skip (not fresh)
8
- * (4) .nexus/rules/<role>.md absent → core index only
9
- * (5) core index > 2KB → truncated to recent-modified N entries
10
- * (6) tracker append: new entry created; same agent_id is idempotent (no duplicate)
11
- */
12
-
13
- import { describe, test, expect, beforeAll, afterAll } from "bun:test";
14
- import { mkdtempSync, mkdirSync, writeFileSync, existsSync, readFileSync, rmSync, utimesSync } from "node:fs";
15
- import { join } from "node:path";
16
- import { tmpdir } from "node:os";
17
-
18
- import handler from "./handler.ts";
19
-
20
- // ---------------------------------------------------------------------------
21
- // Fixture helpers
22
- // ---------------------------------------------------------------------------
23
-
24
- /** Create a temp directory tree suitable for agent-bootstrap tests.
25
- * Returns the cwd (root of the fixture).
26
- *
27
- * Layout:
28
- * <root>/
29
- * assets/agents/architect/ ← registered role
30
- * .nexus/memory/ ← memory .md files
31
- * .nexus/context/ ← context .md files
32
- * .nexus/rules/architect.md ← role rule
33
- * .nexus/state/sessions/<sid>/ ← session dir (no tracker by default)
34
- */
35
- function makeFixture(opts: {
36
- withRule?: boolean;
37
- memoryFiles?: number;
38
- contextFiles?: number;
39
- withTracker?: { agentId: string; resumeCount: number };
40
- sessionId?: string;
41
- } = {}): { cwd: string; sessionId: string; cleanup: () => void } {
42
- const {
43
- withRule = true,
44
- memoryFiles = 1,
45
- contextFiles = 1,
46
- withTracker,
47
- sessionId = "sess-test",
48
- } = opts;
49
-
50
- const cwd = mkdtempSync(join(tmpdir(), "nexus-bootstrap-"));
51
-
52
- // Registered role directory
53
- mkdirSync(join(cwd, "assets/agents/architect"), { recursive: true });
54
-
55
- // Memory files
56
- const memDir = join(cwd, ".nexus/memory");
57
- mkdirSync(memDir, { recursive: true });
58
- for (let i = 0; i < memoryFiles; i++) {
59
- writeFileSync(join(memDir, `mem-${i}.md`), `# Memory file ${i}\nsome content`);
60
- }
61
-
62
- // Context files
63
- const ctxDir = join(cwd, ".nexus/context");
64
- mkdirSync(ctxDir, { recursive: true });
65
- for (let i = 0; i < contextFiles; i++) {
66
- writeFileSync(join(ctxDir, `ctx-${i}.md`), `# Context file ${i}\nsome content`);
67
- }
68
-
69
- // Rules
70
- const rulesDir = join(cwd, ".nexus/rules");
71
- mkdirSync(rulesDir, { recursive: true });
72
- if (withRule) {
73
- writeFileSync(join(rulesDir, "architect.md"), "Always think in systems.");
74
- }
75
-
76
- // Session dir
77
- const sessionDir = join(cwd, ".nexus/state", sessionId);
78
- mkdirSync(sessionDir, { recursive: true });
79
-
80
- // Optional tracker
81
- if (withTracker) {
82
- writeFileSync(
83
- join(sessionDir, "agent-tracker.json"),
84
- JSON.stringify([
85
- { agent_id: withTracker.agentId, resume_count: withTracker.resumeCount },
86
- ])
87
- );
88
- }
89
-
90
- return {
91
- cwd,
92
- sessionId,
93
- cleanup: () => rmSync(cwd, { recursive: true, force: true }),
94
- };
95
- }
96
-
97
- /** Build a SubagentStart input */
98
- function makeInput(
99
- cwd: string,
100
- sessionId: string,
101
- agentType: string,
102
- agentId = "agent-001"
103
- ) {
104
- return {
105
- hook_event_name: "SubagentStart" as const,
106
- session_id: sessionId,
107
- cwd,
108
- agent_type: agentType,
109
- agent_id: agentId,
110
- };
111
- }
112
-
113
- // ---------------------------------------------------------------------------
114
- // Scenario (1): fresh + registered role → additional_context with core index + rules
115
- // ---------------------------------------------------------------------------
116
-
117
- describe("scenario 1: fresh + registered role", () => {
118
- let cleanup: () => void;
119
-
120
- afterAll(() => cleanup?.());
121
-
122
- test("additional_context contains core index and role rule", async () => {
123
- const { cwd, sessionId, cleanup: c } = makeFixture({ withRule: true });
124
- cleanup = c;
125
-
126
- const result = await handler(makeInput(cwd, sessionId, "architect"));
127
-
128
- expect(result).toBeDefined();
129
- expect(result!.additional_context).toBeDefined();
130
- const ctx = result!.additional_context!;
131
-
132
- // Core index header
133
- expect(ctx).toContain("Available memory/context:");
134
- // At least one .md entry
135
- expect(ctx).toMatch(/\.nexus\/(memory|context)\/.*\.md/);
136
- // Role rule injection
137
- expect(ctx).toContain("Custom rule for architect:");
138
- expect(ctx).toContain("Always think in systems.");
139
- });
140
- });
141
-
142
- // ---------------------------------------------------------------------------
143
- // Scenario (2): fresh + unregistered role → silent skip
144
- // ---------------------------------------------------------------------------
145
-
146
- describe("scenario 2: fresh + unregistered role", () => {
147
- let cleanup: () => void;
148
-
149
- afterAll(() => cleanup?.());
150
-
151
- test("returns undefined (no additional_context) for unknown role", async () => {
152
- const { cwd, sessionId, cleanup: c } = makeFixture({ withRule: false });
153
- cleanup = c;
154
-
155
- const result = await handler(makeInput(cwd, sessionId, "general"));
156
-
157
- // Silent skip: handler returns void / undefined
158
- expect(result == null).toBe(true);
159
- });
160
- });
161
-
162
- // ---------------------------------------------------------------------------
163
- // Scenario (3): resume_count > 0 → skip entirely
164
- // ---------------------------------------------------------------------------
165
-
166
- describe("scenario 3: resume — skip on resume_count > 0", () => {
167
- let cleanup: () => void;
168
-
169
- afterAll(() => cleanup?.());
170
-
171
- test("returns undefined when agent has been resumed", async () => {
172
- const agentId = "agent-resume";
173
- const { cwd, sessionId, cleanup: c } = makeFixture({
174
- withTracker: { agentId, resumeCount: 1 },
175
- });
176
- cleanup = c;
177
-
178
- const result = await handler(makeInput(cwd, sessionId, "architect", agentId));
179
-
180
- expect(result == null).toBe(true);
181
- });
182
- });
183
-
184
- // ---------------------------------------------------------------------------
185
- // Scenario (4): no .nexus/rules/<role>.md → core index only (no rule block)
186
- // ---------------------------------------------------------------------------
187
-
188
- describe("scenario 4: no role rule file → core index only", () => {
189
- let cleanup: () => void;
190
-
191
- afterAll(() => cleanup?.());
192
-
193
- test("additional_context has core index but no rule block", async () => {
194
- const { cwd, sessionId, cleanup: c } = makeFixture({ withRule: false });
195
- cleanup = c;
196
-
197
- const result = await handler(makeInput(cwd, sessionId, "architect"));
198
-
199
- expect(result).toBeDefined();
200
- const ctx = result!.additional_context!;
201
-
202
- expect(ctx).toContain("Available memory/context:");
203
- expect(ctx).not.toContain("Custom rule for architect:");
204
- });
205
- });
206
-
207
- // ---------------------------------------------------------------------------
208
- // Scenario (5): core index > 2KB → truncated to recent N entries
209
- // ---------------------------------------------------------------------------
210
-
211
- describe("scenario 5: 2KB truncation of core index", () => {
212
- let cleanup: () => void;
213
-
214
- afterAll(() => cleanup?.());
215
-
216
- test("core index is truncated when total size exceeds 2KB", async () => {
217
- // Create enough files to exceed 2KB.
218
- // Each entry line looks like:
219
- // "- .nexus/memory/mem-XX.md: Memory file XX" (~45 chars + newline)
220
- // 2048 / 46 ≈ 44 entries needed; create 60 to be safe.
221
- const LOTS = 60;
222
- const { cwd, sessionId, cleanup: c } = makeFixture({
223
- withRule: false,
224
- memoryFiles: LOTS,
225
- contextFiles: 0,
226
- });
227
- cleanup = c;
228
-
229
- // Spread mtimes so "recent" ordering is deterministic:
230
- // give each file a distinct mtime (oldest → newest = index 0 → LOTS-1)
231
- for (let i = 0; i < LOTS; i++) {
232
- const filePath = join(cwd, ".nexus/memory", `mem-${i}.md`);
233
- const t = new Date(Date.now() - (LOTS - i) * 10_000); // older files have smaller index
234
- utimesSync(filePath, t, t);
235
- }
236
-
237
- const result = await handler(makeInput(cwd, sessionId, "architect"));
238
-
239
- expect(result).toBeDefined();
240
- const ctx = result!.additional_context!;
241
- expect(ctx).toContain("Available memory/context:");
242
-
243
- // The raw section between <system-notice> tags for the core index
244
- const indexSection = ctx.split("</system-notice>")[0];
245
-
246
- // Should NOT contain all 60 files — truncation must have kicked in
247
- const entryCount = (indexSection.match(/- \.nexus\/memory\/mem-/g) ?? []).length;
248
- expect(entryCount).toBeGreaterThan(0);
249
- expect(entryCount).toBeLessThan(LOTS);
250
-
251
- // The index section must not exceed 2KB (plus small wrapper overhead)
252
- const indexBytes = new TextEncoder().encode(indexSection).length;
253
- // Allow a generous margin for the header line and wrapping
254
- expect(indexBytes).toBeLessThan(2048 + 200);
255
- });
256
- });
257
-
258
- // ---------------------------------------------------------------------------
259
- // Scenario (6): tracker append
260
- // ---------------------------------------------------------------------------
261
-
262
- describe("scenario 6: tracker append", () => {
263
- let cleanup: () => void;
264
-
265
- afterAll(() => cleanup?.());
266
-
267
- test("agent-tracker.json is created with running entry for fresh agent", async () => {
268
- const { cwd, sessionId, cleanup: c } = makeFixture({ withTracker: undefined });
269
- cleanup = c;
270
-
271
- const trackerPath = join(cwd, ".nexus/state", sessionId, "agent-tracker.json");
272
-
273
- expect(existsSync(trackerPath)).toBe(false);
274
-
275
- await handler(makeInput(cwd, sessionId, "architect", "agent-001"));
276
-
277
- expect(existsSync(trackerPath)).toBe(true);
278
- const tracker = JSON.parse(readFileSync(trackerPath, "utf-8")) as Array<Record<string, unknown>>;
279
- expect(tracker).toHaveLength(1);
280
- expect(tracker[0]["agent_id"]).toBe("agent-001");
281
- expect(tracker[0]["agent_type"]).toBe("architect");
282
- expect(tracker[0]["status"]).toBe("running");
283
- expect(typeof tracker[0]["started_at"]).toBe("string");
284
- });
285
-
286
- test("duplicate agent_id on second call does not create a second entry", async () => {
287
- const { cwd, sessionId, cleanup: c } = makeFixture({ withTracker: undefined });
288
- cleanup = c;
289
-
290
- const trackerPath = join(cwd, ".nexus/state", sessionId, "agent-tracker.json");
291
-
292
- await handler(makeInput(cwd, sessionId, "architect", "agent-001"));
293
- await handler(makeInput(cwd, sessionId, "architect", "agent-001"));
294
-
295
- const tracker = JSON.parse(readFileSync(trackerPath, "utf-8")) as Array<Record<string, unknown>>;
296
- expect(tracker.filter((e) => e["agent_id"] === "agent-001")).toHaveLength(1);
297
- });
298
- });
299
-
300
- // ---------------------------------------------------------------------------
301
- // 모듈 전역 상태 격리
302
- // ---------------------------------------------------------------------------
303
-
304
- describe("모듈 전역 상태 격리", () => {
305
- // Test A: two different cwds with different agent sets produce independent results
306
- test("Test A: different cwds return only their own roles", async () => {
307
- const tmpDir1 = mkdtempSync(join(tmpdir(), "nexus-isolation-a1-"));
308
- const tmpDir2 = mkdtempSync(join(tmpdir(), "nexus-isolation-a2-"));
309
-
310
- try {
311
- // tmpDir1: only "architect"
312
- mkdirSync(join(tmpDir1, "assets/agents/architect"), { recursive: true });
313
- mkdirSync(join(tmpDir1, ".nexus/memory"), { recursive: true });
314
- writeFileSync(join(tmpDir1, ".nexus/memory/mem.md"), "# mem\ncontent");
315
- mkdirSync(join(tmpDir1, ".nexus/state/sess1"), { recursive: true });
316
-
317
- // tmpDir2: only "engineer"
318
- mkdirSync(join(tmpDir2, "assets/agents/engineer"), { recursive: true });
319
- mkdirSync(join(tmpDir2, ".nexus/memory"), { recursive: true });
320
- writeFileSync(join(tmpDir2, ".nexus/memory/mem.md"), "# mem\ncontent");
321
- mkdirSync(join(tmpDir2, ".nexus/state/sess2"), { recursive: true });
322
-
323
- // Call with tmpDir1 as architect → should return context
324
- const r1a = await handler(makeInput(tmpDir1, "sess1", "architect"));
325
- expect(r1a).toBeDefined();
326
-
327
- // Call with tmpDir1 as engineer → should be skipped (engineer not in tmpDir1)
328
- const r1b = await handler(makeInput(tmpDir1, "sess1", "engineer"));
329
- expect(r1b == null).toBe(true);
330
-
331
- // Call with tmpDir2 as engineer → should return context
332
- const r2a = await handler(makeInput(tmpDir2, "sess2", "engineer"));
333
- expect(r2a).toBeDefined();
334
-
335
- // Call with tmpDir2 as architect → should be skipped (architect not in tmpDir2)
336
- const r2b = await handler(makeInput(tmpDir2, "sess2", "architect"));
337
- expect(r2b == null).toBe(true);
338
- } finally {
339
- rmSync(tmpDir1, { recursive: true, force: true });
340
- rmSync(tmpDir2, { recursive: true, force: true });
341
- }
342
- });
343
-
344
- // Test B: adding a new role directory is picked up on the next call
345
- test("Test B: newly added role is reflected in subsequent call", async () => {
346
- const tmpDir = mkdtempSync(join(tmpdir(), "nexus-isolation-b-"));
347
-
348
- try {
349
- // Start with only "architect"
350
- mkdirSync(join(tmpDir, "assets/agents/architect"), { recursive: true });
351
- mkdirSync(join(tmpDir, ".nexus/memory"), { recursive: true });
352
- writeFileSync(join(tmpDir, ".nexus/memory/mem.md"), "# mem\ncontent");
353
- mkdirSync(join(tmpDir, ".nexus/state/sess"), { recursive: true });
354
-
355
- // "foo" does not exist yet → should be skipped
356
- const r1 = await handler(makeInput(tmpDir, "sess", "foo"));
357
- expect(r1 == null).toBe(true);
358
-
359
- // Add "foo" role directory
360
- mkdirSync(join(tmpDir, "assets/agents/foo"), { recursive: true });
361
-
362
- // Now "foo" should be recognized on the next call
363
- const r2 = await handler(makeInput(tmpDir, "sess", "foo"));
364
- expect(r2).toBeDefined();
365
- } finally {
366
- rmSync(tmpDir, { recursive: true, force: true });
367
- }
368
- });
369
- });
@@ -1,132 +0,0 @@
1
- import type { HookHandler } from "../../../src/hooks/types.js";
2
- import { updateJsonFileLocked } from "../../../src/shared/json-store.js";
3
- import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
4
- import { join } from "node:path";
5
-
6
- const CORE_INDEX_SIZE_LIMIT = 2 * 1024; // 2KB
7
-
8
- function loadValidRoles(cwd: string): string[] {
9
- const inlined = (globalThis as unknown as { __NEXUS_INLINE_AGENT_ROLES__?: string[] }).__NEXUS_INLINE_AGENT_ROLES__;
10
- if (Array.isArray(inlined)) return inlined;
11
- const agentsDir = join(cwd, "assets/agents");
12
- if (!existsSync(agentsDir)) return [];
13
- return readdirSync(agentsDir, { withFileTypes: true })
14
- .filter((e) => e.isDirectory())
15
- .map((e) => e.name);
16
- }
17
-
18
- function readFirstLine(path: string): string {
19
- try {
20
- const content = readFileSync(path, "utf-8");
21
- const firstNonEmpty =
22
- content.split("\n").find((l) => l.trim().length > 0) ?? "";
23
- return firstNonEmpty.replace(/^#+\s*/, "").slice(0, 80);
24
- } catch {
25
- return "";
26
- }
27
- }
28
-
29
- function buildCoreIndex(cwd: string): string {
30
- const entries: Array<{ path: string; mtime: number; line: string }> = [];
31
-
32
- for (const sub of [".nexus/memory", ".nexus/context"]) {
33
- const absDir = join(cwd, sub);
34
- if (!existsSync(absDir)) continue;
35
- for (const f of readdirSync(absDir, { withFileTypes: true })) {
36
- if (!f.isFile() || !f.name.endsWith(".md")) continue;
37
- const full = join(absDir, f.name);
38
- entries.push({
39
- path: `${sub}/${f.name}`,
40
- mtime: statSync(full).mtimeMs,
41
- line: readFirstLine(full),
42
- });
43
- }
44
- }
45
-
46
- entries.sort((a, b) => b.mtime - a.mtime);
47
-
48
- const lines: string[] = [];
49
- let bytes = 0;
50
- for (const e of entries) {
51
- const formatted = `- ${e.path}: ${e.line}`;
52
- if (bytes + formatted.length + 1 > CORE_INDEX_SIZE_LIMIT) break;
53
- lines.push(formatted);
54
- bytes += formatted.length + 1;
55
- }
56
-
57
- return lines.length > 0
58
- ? "Available memory/context:\n" + lines.join("\n")
59
- : "";
60
- }
61
-
62
- function getResumeCount(
63
- cwd: string,
64
- sessionId: string,
65
- agentId: string
66
- ): number {
67
- const trackerPath = join(
68
- cwd,
69
- ".nexus/state",
70
- sessionId,
71
- "agent-tracker.json"
72
- );
73
- if (!existsSync(trackerPath)) return 0;
74
- try {
75
- const tracker = JSON.parse(readFileSync(trackerPath, "utf-8"));
76
- const entry = Array.isArray(tracker)
77
- ? tracker.find((e: { agent_id?: string }) => e.agent_id === agentId)
78
- : null;
79
- return (entry as { resume_count?: number } | null)?.resume_count ?? 0;
80
- } catch {
81
- return 0;
82
- }
83
- }
84
-
85
- const handler: HookHandler = async (input) => {
86
- if (input.hook_event_name !== "SubagentStart") return;
87
-
88
- const { cwd, session_id, agent_type, agent_id } = input;
89
-
90
- // fresh only — skip on resume
91
- const resumeCount = getResumeCount(cwd, session_id, agent_id);
92
- if (resumeCount > 0) return;
93
-
94
- // unregistered role: silent skip
95
- const validRoles = loadValidRoles(cwd);
96
- if (!validRoles.includes(agent_type)) return;
97
-
98
- const trackerPath = join(cwd, ".nexus/state", session_id, "agent-tracker.json");
99
- await updateJsonFileLocked(trackerPath, [], (tracker: Array<Record<string, unknown>>) => {
100
- const list = Array.isArray(tracker) ? tracker : [];
101
- if (list.find((e) => e["agent_id"] === agent_id)) return list;
102
- list.push({
103
- agent_id,
104
- agent_type,
105
- started_at: new Date().toISOString(),
106
- status: "running",
107
- });
108
- return list;
109
- });
110
-
111
- const parts: string[] = [];
112
-
113
- const coreIndex = buildCoreIndex(cwd);
114
- if (coreIndex) {
115
- parts.push(`<system-notice>\n${coreIndex}\n</system-notice>`);
116
- }
117
-
118
- const rulePath = join(cwd, ".nexus/rules", `${agent_type}.md`);
119
- if (existsSync(rulePath)) {
120
- const ruleContent = readFileSync(rulePath, "utf-8").trim();
121
- if (ruleContent) {
122
- parts.push(
123
- `<system-notice>\nCustom rule for ${agent_type}:\n${ruleContent}\n</system-notice>`
124
- );
125
- }
126
- }
127
-
128
- if (parts.length === 0) return;
129
- return { additional_context: parts.join("\n\n") };
130
- };
131
-
132
- export default handler;
@@ -1,10 +0,0 @@
1
- name: agent-bootstrap
2
- description: Inject core memory index and role-specific rules on fresh subagent spawn
3
- events: [SubagentStart]
4
- matcher: "*"
5
- timeout: 10
6
- fallback: warn
7
- priority: 0
8
- requires_capabilities:
9
- - event.subagent_start
10
- - output.additional_context.session_start