@gwdn/nexus-mcp 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/.github/workflows/ci.yml +38 -0
  2. package/.github/workflows/release.yml +57 -0
  3. package/README.md +89 -0
  4. package/dist/auth.d.ts +39 -0
  5. package/dist/auth.d.ts.map +1 -0
  6. package/dist/auth.js +47 -0
  7. package/dist/auth.js.map +1 -0
  8. package/dist/nexus-api.d.ts +35 -0
  9. package/dist/nexus-api.d.ts.map +1 -0
  10. package/dist/nexus-api.js +90 -0
  11. package/dist/nexus-api.js.map +1 -0
  12. package/dist/server.d.ts +67 -0
  13. package/dist/server.d.ts.map +1 -0
  14. package/dist/server.js +189 -0
  15. package/dist/server.js.map +1 -0
  16. package/dist/tools/add-task-note.d.ts +34 -0
  17. package/dist/tools/add-task-note.d.ts.map +1 -0
  18. package/dist/tools/add-task-note.js +39 -0
  19. package/dist/tools/add-task-note.js.map +1 -0
  20. package/dist/tools/append-session-entry.d.ts +53 -0
  21. package/dist/tools/append-session-entry.d.ts.map +1 -0
  22. package/dist/tools/append-session-entry.js +68 -0
  23. package/dist/tools/append-session-entry.js.map +1 -0
  24. package/dist/tools/create-task.d.ts +52 -0
  25. package/dist/tools/create-task.d.ts.map +1 -0
  26. package/dist/tools/create-task.js +51 -0
  27. package/dist/tools/create-task.js.map +1 -0
  28. package/dist/tools/decision-comments.d.ts +54 -0
  29. package/dist/tools/decision-comments.d.ts.map +1 -0
  30. package/dist/tools/decision-comments.js +81 -0
  31. package/dist/tools/decision-comments.js.map +1 -0
  32. package/dist/tools/get-document.d.ts +47 -0
  33. package/dist/tools/get-document.d.ts.map +1 -0
  34. package/dist/tools/get-document.js +68 -0
  35. package/dist/tools/get-document.js.map +1 -0
  36. package/dist/tools/get-project-memory.d.ts +47 -0
  37. package/dist/tools/get-project-memory.d.ts.map +1 -0
  38. package/dist/tools/get-project-memory.js +53 -0
  39. package/dist/tools/get-project-memory.js.map +1 -0
  40. package/dist/tools/get-related-entities.d.ts +44 -0
  41. package/dist/tools/get-related-entities.d.ts.map +1 -0
  42. package/dist/tools/get-related-entities.js +60 -0
  43. package/dist/tools/get-related-entities.js.map +1 -0
  44. package/dist/tools/governance.d.ts +90 -0
  45. package/dist/tools/governance.d.ts.map +1 -0
  46. package/dist/tools/governance.js +127 -0
  47. package/dist/tools/governance.js.map +1 -0
  48. package/dist/tools/ingest-document.d.ts +40 -0
  49. package/dist/tools/ingest-document.d.ts.map +1 -0
  50. package/dist/tools/ingest-document.js +49 -0
  51. package/dist/tools/ingest-document.js.map +1 -0
  52. package/dist/tools/letter-inbox.d.ts +80 -0
  53. package/dist/tools/letter-inbox.d.ts.map +1 -0
  54. package/dist/tools/letter-inbox.js +118 -0
  55. package/dist/tools/letter-inbox.js.map +1 -0
  56. package/dist/tools/letters.d.ts +91 -0
  57. package/dist/tools/letters.d.ts.map +1 -0
  58. package/dist/tools/letters.js +112 -0
  59. package/dist/tools/letters.js.map +1 -0
  60. package/dist/tools/list-documents.d.ts +33 -0
  61. package/dist/tools/list-documents.d.ts.map +1 -0
  62. package/dist/tools/list-documents.js +47 -0
  63. package/dist/tools/list-documents.js.map +1 -0
  64. package/dist/tools/list-tasks.d.ts +39 -0
  65. package/dist/tools/list-tasks.d.ts.map +1 -0
  66. package/dist/tools/list-tasks.js +46 -0
  67. package/dist/tools/list-tasks.js.map +1 -0
  68. package/dist/tools/project-list.d.ts +28 -0
  69. package/dist/tools/project-list.d.ts.map +1 -0
  70. package/dist/tools/project-list.js +43 -0
  71. package/dist/tools/project-list.js.map +1 -0
  72. package/dist/tools/reviews.d.ts +145 -0
  73. package/dist/tools/reviews.d.ts.map +1 -0
  74. package/dist/tools/reviews.js +220 -0
  75. package/dist/tools/reviews.js.map +1 -0
  76. package/dist/tools/search-knowledge.d.ts +48 -0
  77. package/dist/tools/search-knowledge.d.ts.map +1 -0
  78. package/dist/tools/search-knowledge.js +54 -0
  79. package/dist/tools/search-knowledge.js.map +1 -0
  80. package/dist/tools/sessions.d.ts +81 -0
  81. package/dist/tools/sessions.d.ts.map +1 -0
  82. package/dist/tools/sessions.js +123 -0
  83. package/dist/tools/sessions.js.map +1 -0
  84. package/dist/tools/skill-assign.d.ts +77 -0
  85. package/dist/tools/skill-assign.d.ts.map +1 -0
  86. package/dist/tools/skill-assign.js +108 -0
  87. package/dist/tools/skill-assign.js.map +1 -0
  88. package/dist/tools/skills.d.ts +138 -0
  89. package/dist/tools/skills.d.ts.map +1 -0
  90. package/dist/tools/skills.js +195 -0
  91. package/dist/tools/skills.js.map +1 -0
  92. package/dist/tools/update-task-status.d.ts +48 -0
  93. package/dist/tools/update-task-status.d.ts.map +1 -0
  94. package/dist/tools/update-task-status.js +51 -0
  95. package/dist/tools/update-task-status.js.map +1 -0
  96. package/package.json +30 -0
  97. package/src/__tests__/auth.test.ts +162 -0
  98. package/src/__tests__/decision-comments.test.ts +173 -0
  99. package/src/__tests__/e2e-integration.test.ts +443 -0
  100. package/src/__tests__/helpers.ts +58 -0
  101. package/src/__tests__/layer1-knowledge.test.ts +302 -0
  102. package/src/__tests__/layer2-coordination.test.ts +842 -0
  103. package/src/__tests__/layer3-governance.test.ts +205 -0
  104. package/src/__tests__/project-list-and-skill-assign.test.ts +282 -0
  105. package/src/__tests__/reviews.test.ts +420 -0
  106. package/src/__tests__/server.test.ts +250 -0
  107. package/src/__tests__/setup.ts +15 -0
  108. package/src/__tests__/task-list-and-doc-list.test.ts +226 -0
  109. package/src/auth.ts +81 -0
  110. package/src/nexus-api.ts +127 -0
  111. package/src/server.ts +520 -0
  112. package/src/tools/add-task-note.ts +50 -0
  113. package/src/tools/append-session-entry.ts +84 -0
  114. package/src/tools/create-task.ts +66 -0
  115. package/src/tools/decision-comments.ts +103 -0
  116. package/src/tools/get-document.ts +80 -0
  117. package/src/tools/get-project-memory.ts +65 -0
  118. package/src/tools/get-related-entities.ts +73 -0
  119. package/src/tools/governance.ts +165 -0
  120. package/src/tools/ingest-document.ts +65 -0
  121. package/src/tools/letter-inbox.ts +157 -0
  122. package/src/tools/letters.ts +144 -0
  123. package/src/tools/list-documents.ts +58 -0
  124. package/src/tools/list-tasks.ts +57 -0
  125. package/src/tools/project-list.ts +52 -0
  126. package/src/tools/reviews.ts +281 -0
  127. package/src/tools/search-knowledge.ts +68 -0
  128. package/src/tools/sessions.ts +157 -0
  129. package/src/tools/skill-assign.ts +142 -0
  130. package/src/tools/skills.ts +255 -0
  131. package/src/tools/update-task-status.ts +64 -0
  132. package/tsconfig.json +20 -0
  133. package/vitest.config.ts +8 -0
@@ -0,0 +1,255 @@
1
+ /**
2
+ * sk_list + sk_get + sk_create + sk_update + sk_activate -- Layer 2 Coordination
3
+ *
4
+ * Skill management tools for the Nexus platform.
5
+ * Skills are tenant-scoped instruction sets for agent sessions.
6
+ * Delegates to POST /api/mcp/skills.
7
+ */
8
+
9
+ import { z } from 'zod'
10
+ import { nexusPost } from '../nexus-api.js'
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // sk_list
14
+ // ---------------------------------------------------------------------------
15
+
16
+ export const skListSchema = {
17
+ status_filter: z
18
+ .array(z.enum(['draft', 'active', 'archived']))
19
+ .optional()
20
+ .describe('Filter by skill status (default: draft, active)'),
21
+ limit: z
22
+ .number()
23
+ .min(1)
24
+ .max(100)
25
+ .default(50)
26
+ .describe('Max number of skills to return'),
27
+ }
28
+
29
+ type SkListArgs = {
30
+ status_filter?: string[]
31
+ limit?: number
32
+ user_id: string
33
+ }
34
+
35
+ export async function skList(args: SkListArgs) {
36
+ const result = await nexusPost('/api/mcp/skills', {
37
+ action: 'sk_list',
38
+ status_filter: args.status_filter,
39
+ limit: args.limit ?? 50,
40
+ })
41
+
42
+ if (!result.ok) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: 'text' as const,
47
+ text: JSON.stringify({ error: result.error }, null, 2),
48
+ },
49
+ ],
50
+ isError: true,
51
+ }
52
+ }
53
+
54
+ return {
55
+ content: [
56
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
57
+ ],
58
+ }
59
+ }
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // sk_get
63
+ // ---------------------------------------------------------------------------
64
+
65
+ export const skGetSchema = {
66
+ skill_id: z
67
+ .string()
68
+ .max(200)
69
+ .describe('Skill identifier (e.g., nx-init-nexus) or UUID'),
70
+ }
71
+
72
+ type SkGetArgs = {
73
+ skill_id: string
74
+ user_id: string
75
+ }
76
+
77
+ export async function skGet(args: SkGetArgs) {
78
+ const result = await nexusPost('/api/mcp/skills', {
79
+ action: 'sk_get',
80
+ skill_id: args.skill_id,
81
+ })
82
+
83
+ if (!result.ok) {
84
+ return {
85
+ content: [
86
+ {
87
+ type: 'text' as const,
88
+ text: JSON.stringify({ error: result.error }, null, 2),
89
+ },
90
+ ],
91
+ isError: true,
92
+ }
93
+ }
94
+
95
+ return {
96
+ content: [
97
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
98
+ ],
99
+ }
100
+ }
101
+
102
+ // ---------------------------------------------------------------------------
103
+ // sk_create
104
+ // ---------------------------------------------------------------------------
105
+
106
+ export const skCreateSchema = {
107
+ skill_id: z.string().max(200).describe('Skill identifier (e.g., nx-init-nexus)'),
108
+ name: z.string().max(500).describe('Human-readable skill name'),
109
+ description: z.string().max(1000).optional().describe('Short description'),
110
+ body: z.string().max(100_000).describe('Full markdown instruction content'),
111
+ auto_generate_command: z
112
+ .boolean()
113
+ .default(true)
114
+ .describe('Auto-generate an OpenCode command (default: true)'),
115
+ }
116
+
117
+ type SkCreateArgs = {
118
+ skill_id: string
119
+ name: string
120
+ description?: string
121
+ body: string
122
+ auto_generate_command?: boolean
123
+ user_id: string
124
+ }
125
+
126
+ export async function skCreate(args: SkCreateArgs) {
127
+ const result = await nexusPost('/api/mcp/skills', {
128
+ action: 'sk_create',
129
+ skill_id: args.skill_id,
130
+ name: args.name,
131
+ description: args.description,
132
+ body: args.body,
133
+ auto_generate_command: args.auto_generate_command ?? true,
134
+ })
135
+
136
+ if (!result.ok) {
137
+ return {
138
+ content: [
139
+ {
140
+ type: 'text' as const,
141
+ text: JSON.stringify({ error: result.error }, null, 2),
142
+ },
143
+ ],
144
+ isError: true,
145
+ }
146
+ }
147
+
148
+ return {
149
+ content: [
150
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
151
+ ],
152
+ }
153
+ }
154
+
155
+ // ---------------------------------------------------------------------------
156
+ // sk_update
157
+ // ---------------------------------------------------------------------------
158
+
159
+ export const skUpdateSchema = {
160
+ skill_id: z
161
+ .string()
162
+ .max(200)
163
+ .describe('Skill identifier (e.g., nx-init-nexus) or UUID'),
164
+ name: z.string().max(500).optional().describe('Updated name'),
165
+ description: z.string().max(1000).optional().describe('Updated description'),
166
+ body: z.string().max(100_000).optional().describe('Updated markdown content'),
167
+ auto_generate_command: z
168
+ .boolean()
169
+ .optional()
170
+ .describe('Toggle command auto-generation'),
171
+ }
172
+
173
+ type SkUpdateArgs = {
174
+ skill_id: string
175
+ name?: string
176
+ description?: string
177
+ body?: string
178
+ auto_generate_command?: boolean
179
+ user_id: string
180
+ }
181
+
182
+ export async function skUpdate(args: SkUpdateArgs) {
183
+ const result = await nexusPost('/api/mcp/skills', {
184
+ action: 'sk_update',
185
+ skill_id: args.skill_id,
186
+ name: args.name,
187
+ description: args.description,
188
+ body: args.body,
189
+ auto_generate_command: args.auto_generate_command,
190
+ })
191
+
192
+ if (!result.ok) {
193
+ return {
194
+ content: [
195
+ {
196
+ type: 'text' as const,
197
+ text: JSON.stringify({ error: result.error }, null, 2),
198
+ },
199
+ ],
200
+ isError: true,
201
+ }
202
+ }
203
+
204
+ return {
205
+ content: [
206
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
207
+ ],
208
+ }
209
+ }
210
+
211
+ // ---------------------------------------------------------------------------
212
+ // sk_activate
213
+ // ---------------------------------------------------------------------------
214
+
215
+ export const skActivateSchema = {
216
+ skill_id: z
217
+ .string()
218
+ .max(200)
219
+ .describe('Skill identifier (e.g., nx-init-nexus) or UUID'),
220
+ status: z
221
+ .enum(['active', 'archived', 'draft'])
222
+ .describe('New status for the skill'),
223
+ }
224
+
225
+ type SkActivateArgs = {
226
+ skill_id: string
227
+ status: string
228
+ user_id: string
229
+ }
230
+
231
+ export async function skActivate(args: SkActivateArgs) {
232
+ const result = await nexusPost('/api/mcp/skills', {
233
+ action: 'sk_activate',
234
+ skill_id: args.skill_id,
235
+ status: args.status,
236
+ })
237
+
238
+ if (!result.ok) {
239
+ return {
240
+ content: [
241
+ {
242
+ type: 'text' as const,
243
+ text: JSON.stringify({ error: result.error }, null, 2),
244
+ },
245
+ ],
246
+ isError: true,
247
+ }
248
+ }
249
+
250
+ return {
251
+ content: [
252
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
253
+ ],
254
+ }
255
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * task_update -- Layer 2 Coordination
3
+ *
4
+ * Updates the status (and optionally priority/assignee) of an existing task.
5
+ * Delegates to POST /api/mcp/tasks (action: task_update).
6
+ */
7
+
8
+ import { z } from 'zod'
9
+ import { nexusPost } from '../nexus-api.js'
10
+
11
+ export const updateTaskStatusSchema = {
12
+ task_id: z.string().uuid().describe('Task UUID to update'),
13
+ status: z
14
+ .enum(['open', 'in_progress', 'blocked', 'done', 'cancelled'])
15
+ .describe('New task status'),
16
+ priority: z
17
+ .enum(['low', 'medium', 'high', 'urgent'])
18
+ .optional()
19
+ .describe('Updated priority (optional)'),
20
+ assignee: z
21
+ .string()
22
+ .uuid()
23
+ .optional()
24
+ .describe('UUID of the newly assigned user (optional)'),
25
+ agent_id: z.string().max(200).optional().describe('Agent identifier if applicable'),
26
+ }
27
+
28
+ type UpdateTaskStatusArgs = {
29
+ task_id: string
30
+ status: string
31
+ priority?: string
32
+ assignee?: string
33
+ user_id: string
34
+ agent_id?: string
35
+ }
36
+
37
+ export async function updateTaskStatus(args: UpdateTaskStatusArgs) {
38
+ const result = await nexusPost('/api/mcp/tasks', {
39
+ action: 'task_update',
40
+ task_id: args.task_id,
41
+ status: args.status,
42
+ priority: args.priority,
43
+ assignee: args.assignee,
44
+ agent_id: args.agent_id,
45
+ })
46
+
47
+ if (!result.ok) {
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text' as const,
52
+ text: JSON.stringify({ error: result.error }, null, 2),
53
+ },
54
+ ],
55
+ isError: true,
56
+ }
57
+ }
58
+
59
+ return {
60
+ content: [
61
+ { type: 'text' as const, text: JSON.stringify(result.data, null, 2) },
62
+ ],
63
+ }
64
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "lib": ["ES2022"],
7
+ "outDir": "dist",
8
+ "rootDir": "src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true
17
+ },
18
+ "include": ["src/**/*.ts"],
19
+ "exclude": ["node_modules", "dist", "src/__tests__"]
20
+ }
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from 'vitest/config'
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ setupFiles: ['./src/__tests__/setup.ts'],
7
+ },
8
+ })