memory-journal-mcp 4.4.2 → 5.0.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 (291) hide show
  1. package/.github/workflows/codeql.yml +1 -6
  2. package/.github/workflows/docker-publish.yml +15 -49
  3. package/.github/workflows/lint-and-test.yml +1 -1
  4. package/.github/workflows/secrets-scanning.yml +4 -3
  5. package/.github/workflows/security-update.yml +3 -3
  6. package/CHANGELOG.md +213 -0
  7. package/CONTRIBUTING.md +132 -97
  8. package/DOCKER_README.md +184 -235
  9. package/Dockerfile +27 -24
  10. package/README.md +218 -190
  11. package/SECURITY.md +27 -35
  12. package/dist/cli.js +16 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/constants/ServerInstructions.d.ts +5 -1
  15. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  16. package/dist/constants/ServerInstructions.js +133 -73
  17. package/dist/constants/ServerInstructions.js.map +1 -1
  18. package/dist/constants/icons.d.ts +2 -2
  19. package/dist/constants/icons.d.ts.map +1 -1
  20. package/dist/constants/icons.js +7 -6
  21. package/dist/constants/icons.js.map +1 -1
  22. package/dist/database/SqliteAdapter.d.ts +37 -24
  23. package/dist/database/SqliteAdapter.d.ts.map +1 -1
  24. package/dist/database/SqliteAdapter.js +319 -157
  25. package/dist/database/SqliteAdapter.js.map +1 -1
  26. package/dist/database/schema.d.ts +45 -0
  27. package/dist/database/schema.d.ts.map +1 -0
  28. package/dist/database/schema.js +92 -0
  29. package/dist/database/schema.js.map +1 -0
  30. package/dist/filtering/ToolFilter.d.ts +1 -1
  31. package/dist/filtering/ToolFilter.d.ts.map +1 -1
  32. package/dist/filtering/ToolFilter.js +13 -2
  33. package/dist/filtering/ToolFilter.js.map +1 -1
  34. package/dist/github/GitHubIntegration.d.ts.map +1 -1
  35. package/dist/github/GitHubIntegration.js +1 -3
  36. package/dist/github/GitHubIntegration.js.map +1 -1
  37. package/dist/handlers/prompts/github.d.ts +12 -0
  38. package/dist/handlers/prompts/github.d.ts.map +1 -0
  39. package/dist/handlers/prompts/github.js +178 -0
  40. package/dist/handlers/prompts/github.js.map +1 -0
  41. package/dist/handlers/prompts/index.d.ts +23 -2
  42. package/dist/handlers/prompts/index.d.ts.map +1 -1
  43. package/dist/handlers/prompts/index.js +7 -432
  44. package/dist/handlers/prompts/index.js.map +1 -1
  45. package/dist/handlers/prompts/workflow.d.ts +12 -0
  46. package/dist/handlers/prompts/workflow.d.ts.map +1 -0
  47. package/dist/handlers/prompts/workflow.js +277 -0
  48. package/dist/handlers/prompts/workflow.js.map +1 -0
  49. package/dist/handlers/resources/core.d.ts +11 -0
  50. package/dist/handlers/resources/core.d.ts.map +1 -0
  51. package/dist/handlers/resources/core.js +433 -0
  52. package/dist/handlers/resources/core.js.map +1 -0
  53. package/dist/handlers/resources/github.d.ts +11 -0
  54. package/dist/handlers/resources/github.d.ts.map +1 -0
  55. package/dist/handlers/resources/github.js +314 -0
  56. package/dist/handlers/resources/github.js.map +1 -0
  57. package/dist/handlers/resources/graph.d.ts +11 -0
  58. package/dist/handlers/resources/graph.d.ts.map +1 -0
  59. package/dist/handlers/resources/graph.js +204 -0
  60. package/dist/handlers/resources/graph.js.map +1 -0
  61. package/dist/handlers/resources/index.d.ts +5 -20
  62. package/dist/handlers/resources/index.d.ts.map +1 -1
  63. package/dist/handlers/resources/index.js +16 -1278
  64. package/dist/handlers/resources/index.js.map +1 -1
  65. package/dist/handlers/resources/shared.d.ts +60 -0
  66. package/dist/handlers/resources/shared.d.ts.map +1 -0
  67. package/dist/handlers/resources/shared.js +49 -0
  68. package/dist/handlers/resources/shared.js.map +1 -0
  69. package/dist/handlers/resources/team.d.ts +13 -0
  70. package/dist/handlers/resources/team.d.ts.map +1 -0
  71. package/dist/handlers/resources/team.js +119 -0
  72. package/dist/handlers/resources/team.js.map +1 -0
  73. package/dist/handlers/resources/templates.d.ts +13 -0
  74. package/dist/handlers/resources/templates.d.ts.map +1 -0
  75. package/dist/handlers/resources/templates.js +310 -0
  76. package/dist/handlers/resources/templates.js.map +1 -0
  77. package/dist/handlers/tools/admin.d.ts +8 -0
  78. package/dist/handlers/tools/admin.d.ts.map +1 -0
  79. package/dist/handlers/tools/admin.js +270 -0
  80. package/dist/handlers/tools/admin.js.map +1 -0
  81. package/dist/handlers/tools/analytics.d.ts +8 -0
  82. package/dist/handlers/tools/analytics.d.ts.map +1 -0
  83. package/dist/handlers/tools/analytics.js +256 -0
  84. package/dist/handlers/tools/analytics.js.map +1 -0
  85. package/dist/handlers/tools/backup.d.ts +8 -0
  86. package/dist/handlers/tools/backup.d.ts.map +1 -0
  87. package/dist/handlers/tools/backup.js +224 -0
  88. package/dist/handlers/tools/backup.js.map +1 -0
  89. package/dist/handlers/tools/core.d.ts +9 -0
  90. package/dist/handlers/tools/core.d.ts.map +1 -0
  91. package/dist/handlers/tools/core.js +326 -0
  92. package/dist/handlers/tools/core.js.map +1 -0
  93. package/dist/handlers/tools/export.d.ts +8 -0
  94. package/dist/handlers/tools/export.d.ts.map +1 -0
  95. package/dist/handlers/tools/export.js +89 -0
  96. package/dist/handlers/tools/export.js.map +1 -0
  97. package/dist/handlers/tools/github/helpers.d.ts +34 -0
  98. package/dist/handlers/tools/github/helpers.d.ts.map +1 -0
  99. package/dist/handlers/tools/github/helpers.js +52 -0
  100. package/dist/handlers/tools/github/helpers.js.map +1 -0
  101. package/dist/handlers/tools/github/insights-tools.d.ts +8 -0
  102. package/dist/handlers/tools/github/insights-tools.d.ts.map +1 -0
  103. package/dist/handlers/tools/github/insights-tools.js +104 -0
  104. package/dist/handlers/tools/github/insights-tools.js.map +1 -0
  105. package/dist/handlers/tools/github/issue-tools.d.ts +8 -0
  106. package/dist/handlers/tools/github/issue-tools.d.ts.map +1 -0
  107. package/dist/handlers/tools/github/issue-tools.js +359 -0
  108. package/dist/handlers/tools/github/issue-tools.js.map +1 -0
  109. package/dist/handlers/tools/github/kanban-tools.d.ts +8 -0
  110. package/dist/handlers/tools/github/kanban-tools.d.ts.map +1 -0
  111. package/dist/handlers/tools/github/kanban-tools.js +108 -0
  112. package/dist/handlers/tools/github/kanban-tools.js.map +1 -0
  113. package/dist/handlers/tools/github/milestone-tools.d.ts +9 -0
  114. package/dist/handlers/tools/github/milestone-tools.d.ts.map +1 -0
  115. package/dist/handlers/tools/github/milestone-tools.js +302 -0
  116. package/dist/handlers/tools/github/milestone-tools.js.map +1 -0
  117. package/dist/handlers/tools/github/mutation-tools.d.ts +12 -0
  118. package/dist/handlers/tools/github/mutation-tools.d.ts.map +1 -0
  119. package/dist/handlers/tools/github/mutation-tools.js +15 -0
  120. package/dist/handlers/tools/github/mutation-tools.js.map +1 -0
  121. package/dist/handlers/tools/github/read-tools.d.ts +8 -0
  122. package/dist/handlers/tools/github/read-tools.d.ts.map +1 -0
  123. package/dist/handlers/tools/github/read-tools.js +260 -0
  124. package/dist/handlers/tools/github/read-tools.js.map +1 -0
  125. package/dist/handlers/tools/github/schemas.d.ts +467 -0
  126. package/dist/handlers/tools/github/schemas.d.ts.map +1 -0
  127. package/dist/handlers/tools/github/schemas.js +335 -0
  128. package/dist/handlers/tools/github/schemas.js.map +1 -0
  129. package/dist/handlers/tools/github.d.ts +14 -0
  130. package/dist/handlers/tools/github.d.ts.map +1 -0
  131. package/dist/handlers/tools/github.js +28 -0
  132. package/dist/handlers/tools/github.js.map +1 -0
  133. package/dist/handlers/tools/index.d.ts +15 -20
  134. package/dist/handlers/tools/index.d.ts.map +1 -1
  135. package/dist/handlers/tools/index.js +117 -2909
  136. package/dist/handlers/tools/index.js.map +1 -1
  137. package/dist/handlers/tools/relationships.d.ts +8 -0
  138. package/dist/handlers/tools/relationships.d.ts.map +1 -0
  139. package/dist/handlers/tools/relationships.js +308 -0
  140. package/dist/handlers/tools/relationships.js.map +1 -0
  141. package/dist/handlers/tools/schemas.d.ts +108 -0
  142. package/dist/handlers/tools/schemas.d.ts.map +1 -0
  143. package/dist/handlers/tools/schemas.js +122 -0
  144. package/dist/handlers/tools/schemas.js.map +1 -0
  145. package/dist/handlers/tools/search.d.ts +8 -0
  146. package/dist/handlers/tools/search.d.ts.map +1 -0
  147. package/dist/handlers/tools/search.js +282 -0
  148. package/dist/handlers/tools/search.js.map +1 -0
  149. package/dist/handlers/tools/team.d.ts +11 -0
  150. package/dist/handlers/tools/team.d.ts.map +1 -0
  151. package/dist/handlers/tools/team.js +239 -0
  152. package/dist/handlers/tools/team.js.map +1 -0
  153. package/dist/server/McpServer.d.ts +4 -0
  154. package/dist/server/McpServer.d.ts.map +1 -1
  155. package/dist/server/McpServer.js +48 -297
  156. package/dist/server/McpServer.js.map +1 -1
  157. package/dist/server/Scheduler.d.ts +91 -0
  158. package/dist/server/Scheduler.d.ts.map +1 -0
  159. package/dist/server/Scheduler.js +201 -0
  160. package/dist/server/Scheduler.js.map +1 -0
  161. package/dist/transports/http.d.ts +66 -0
  162. package/dist/transports/http.d.ts.map +1 -0
  163. package/dist/transports/http.js +519 -0
  164. package/dist/transports/http.js.map +1 -0
  165. package/dist/types/entities.d.ts +101 -0
  166. package/dist/types/entities.d.ts.map +1 -0
  167. package/dist/types/entities.js +5 -0
  168. package/dist/types/entities.js.map +1 -0
  169. package/dist/types/filtering.d.ts +34 -0
  170. package/dist/types/filtering.d.ts.map +1 -0
  171. package/dist/types/filtering.js +5 -0
  172. package/dist/types/filtering.js.map +1 -0
  173. package/dist/types/github.d.ts +166 -0
  174. package/dist/types/github.d.ts.map +1 -0
  175. package/dist/types/github.js +5 -0
  176. package/dist/types/github.js.map +1 -0
  177. package/dist/types/index.d.ts +35 -292
  178. package/dist/types/index.d.ts.map +1 -1
  179. package/dist/types/index.js +2 -2
  180. package/dist/types/index.js.map +1 -1
  181. package/dist/utils/error-helpers.d.ts +37 -0
  182. package/dist/utils/error-helpers.d.ts.map +1 -0
  183. package/dist/utils/error-helpers.js +47 -0
  184. package/dist/utils/error-helpers.js.map +1 -0
  185. package/dist/utils/logger.d.ts.map +1 -1
  186. package/dist/utils/logger.js +6 -3
  187. package/dist/utils/logger.js.map +1 -1
  188. package/dist/utils/security-utils.d.ts +0 -21
  189. package/dist/utils/security-utils.d.ts.map +1 -1
  190. package/dist/utils/security-utils.js +0 -47
  191. package/dist/utils/security-utils.js.map +1 -1
  192. package/dist/vector/VectorSearchManager.d.ts.map +1 -1
  193. package/dist/vector/VectorSearchManager.js +9 -32
  194. package/dist/vector/VectorSearchManager.js.map +1 -1
  195. package/docker-compose.yml +11 -2
  196. package/hooks/README.md +107 -0
  197. package/hooks/cursor/hooks.json +10 -0
  198. package/hooks/cursor/memory-journal.mdc +22 -0
  199. package/hooks/cursor/session-end.sh +19 -0
  200. package/hooks/kilo-code/session-end-mode.json +11 -0
  201. package/hooks/kiro/session-end.md +13 -0
  202. package/mcp-config-example.json +1 -0
  203. package/package.json +11 -9
  204. package/playwright.config.ts +29 -0
  205. package/releases/v4.5.0.md +116 -0
  206. package/releases/v5.0.0.md +105 -0
  207. package/scripts/generate-server-instructions.ts +176 -0
  208. package/scripts/server-instructions-function-body.ts +77 -0
  209. package/server.json +3 -3
  210. package/src/cli.ts +45 -1
  211. package/src/constants/ServerInstructions.ts +133 -73
  212. package/src/constants/icons.ts +8 -7
  213. package/src/constants/server-instructions.md +268 -0
  214. package/src/database/SqliteAdapter.ts +358 -192
  215. package/src/database/schema.ts +125 -0
  216. package/src/filtering/ToolFilter.ts +13 -2
  217. package/src/github/GitHubIntegration.ts +1 -3
  218. package/src/handlers/prompts/github.ts +209 -0
  219. package/src/handlers/prompts/index.ts +10 -499
  220. package/src/handlers/prompts/workflow.ts +314 -0
  221. package/src/handlers/resources/core.ts +528 -0
  222. package/src/handlers/resources/github.ts +358 -0
  223. package/src/handlers/resources/graph.ts +254 -0
  224. package/src/handlers/resources/index.ts +23 -1570
  225. package/src/handlers/resources/shared.ts +103 -0
  226. package/src/handlers/resources/team.ts +133 -0
  227. package/src/handlers/resources/templates.ts +374 -0
  228. package/src/handlers/tools/admin.ts +285 -0
  229. package/src/handlers/tools/analytics.ts +301 -0
  230. package/src/handlers/tools/backup.ts +242 -0
  231. package/src/handlers/tools/core.ts +350 -0
  232. package/src/handlers/tools/export.ts +115 -0
  233. package/src/handlers/tools/github/helpers.ts +86 -0
  234. package/src/handlers/tools/github/insights-tools.ts +119 -0
  235. package/src/handlers/tools/github/issue-tools.ts +439 -0
  236. package/src/handlers/tools/github/kanban-tools.ts +134 -0
  237. package/src/handlers/tools/github/milestone-tools.ts +392 -0
  238. package/src/handlers/tools/github/mutation-tools.ts +17 -0
  239. package/src/handlers/tools/github/read-tools.ts +328 -0
  240. package/src/handlers/tools/github/schemas.ts +369 -0
  241. package/src/handlers/tools/github.ts +36 -0
  242. package/src/handlers/tools/index.ts +144 -3325
  243. package/src/handlers/tools/relationships.ts +358 -0
  244. package/src/handlers/tools/schemas.ts +132 -0
  245. package/src/handlers/tools/search.ts +343 -0
  246. package/src/handlers/tools/team.ts +273 -0
  247. package/src/server/McpServer.ts +63 -358
  248. package/src/server/Scheduler.ts +278 -0
  249. package/src/transports/http.ts +635 -0
  250. package/src/types/entities.ts +145 -0
  251. package/src/types/filtering.ts +54 -0
  252. package/src/types/github.ts +180 -0
  253. package/src/types/index.ts +67 -375
  254. package/src/utils/error-helpers.ts +52 -0
  255. package/src/utils/logger.ts +6 -3
  256. package/src/utils/security-utils.ts +0 -52
  257. package/src/vector/VectorSearchManager.ts +9 -33
  258. package/tests/constants/icons.test.ts +1 -2
  259. package/tests/constants/server-instructions.test.ts +30 -4
  260. package/tests/database/sqlite-adapter.test.ts +91 -7
  261. package/tests/e2e/auth.spec.ts +154 -0
  262. package/tests/e2e/health.spec.ts +63 -0
  263. package/tests/e2e/protocols.spec.ts +134 -0
  264. package/tests/e2e/resources.spec.ts +103 -0
  265. package/tests/e2e/scheduler.spec.ts +79 -0
  266. package/tests/e2e/security.spec.ts +91 -0
  267. package/tests/e2e/sessions.spec.ts +95 -0
  268. package/tests/e2e/stateless.spec.ts +121 -0
  269. package/tests/e2e/tools.spec.ts +111 -0
  270. package/tests/filtering/tool-filter.test.ts +46 -0
  271. package/tests/handlers/error-path-coverage.test.ts +324 -0
  272. package/tests/handlers/github-resource-handlers.test.ts +453 -0
  273. package/tests/handlers/github-tool-handlers.test.ts +899 -0
  274. package/tests/handlers/prompt-handler-coverage.test.ts +106 -0
  275. package/tests/handlers/prompt-handlers.test.ts +40 -0
  276. package/tests/handlers/resource-handler-coverage.test.ts +181 -0
  277. package/tests/handlers/resource-handlers.test.ts +33 -9
  278. package/tests/handlers/search-tool-handlers.test.ts +272 -0
  279. package/tests/handlers/targeted-gap-closure.test.ts +387 -0
  280. package/tests/handlers/team-resource-handlers.test.ts +156 -0
  281. package/tests/handlers/team-tool-handlers.test.ts +301 -0
  282. package/tests/handlers/tool-handler-coverage.test.ts +469 -0
  283. package/tests/handlers/tool-handlers.test.ts +2 -2
  284. package/tests/security/sql-injection.test.ts +3 -54
  285. package/tests/server/mcp-server.test.ts +503 -8
  286. package/tests/server/scheduler.test.ts +400 -0
  287. package/tests/transports/http-transport.test.ts +620 -0
  288. package/tests/vector/vector-search-manager.test.ts +60 -0
  289. package/vitest.config.ts +4 -1
  290. package/.memory-journal-team.db +0 -0
  291. package/.vscode/settings.json +0 -84
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-tools.d.ts","sourceRoot":"","sources":["../../../../src/handlers/tools/github/milestone-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AA2D1E,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAoU9E"}
@@ -0,0 +1,302 @@
1
+ /**
2
+ * GitHub Milestone Tools - 5 tools
3
+ *
4
+ * Tools: get_github_milestones, get_github_milestone,
5
+ * create_github_milestone, update_github_milestone, delete_github_milestone
6
+ */
7
+ import { z } from 'zod';
8
+ import { formatHandlerError } from '../../../utils/error-helpers.js';
9
+ import { GitHubMilestonesListOutputSchema, GitHubMilestoneResultOutputSchema, CreateMilestoneOutputSchema, UpdateMilestoneOutputSchema, DeleteMilestoneOutputSchema, } from './schemas.js';
10
+ // ============================================================================
11
+ // Helper: owner/repo resolution
12
+ // ============================================================================
13
+ async function resolveOwnerRepo(context, input, entityLabel) {
14
+ if (!context.github) {
15
+ return { error: true, response: { error: 'GitHub integration not available' } };
16
+ }
17
+ const repoInfo = await context.github.getRepoInfo();
18
+ const detectedOwner = repoInfo.owner;
19
+ const detectedRepo = repoInfo.repo;
20
+ const owner = input.owner ?? detectedOwner ?? undefined;
21
+ const repo = input.repo ?? detectedRepo ?? undefined;
22
+ if (!owner || !repo) {
23
+ return {
24
+ error: true,
25
+ response: {
26
+ error: 'STOP: Could not auto-detect repository. DO NOT GUESS. You MUST ask the user to provide the GitHub owner and repository name.',
27
+ requiresUserInput: true,
28
+ detectedOwner,
29
+ detectedRepo,
30
+ instruction: `Ask the user: "${entityLabel}"`,
31
+ },
32
+ };
33
+ }
34
+ return { owner, repo, detectedOwner, detectedRepo, github: context.github };
35
+ }
36
+ // ============================================================================
37
+ // Tool Definitions
38
+ // ============================================================================
39
+ export function getGitHubMilestoneTools(context) {
40
+ return [
41
+ {
42
+ name: 'get_github_milestones',
43
+ title: 'List GitHub Milestones',
44
+ description: 'List GitHub milestones for the repository with completion percentages and due dates.',
45
+ group: 'github',
46
+ inputSchema: z.object({
47
+ state: z
48
+ .string()
49
+ .optional()
50
+ .default('open')
51
+ .describe('Filter by state (default: open)'),
52
+ limit: z
53
+ .number()
54
+ .optional()
55
+ .default(20)
56
+ .describe('Max milestones to return (default: 20)'),
57
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
58
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
59
+ }),
60
+ outputSchema: GitHubMilestonesListOutputSchema,
61
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
62
+ handler: async (params) => {
63
+ try {
64
+ const input = z
65
+ .object({
66
+ state: z.enum(['open', 'closed', 'all']).optional().default('open'),
67
+ limit: z.number().optional().default(20),
68
+ owner: z.string().optional(),
69
+ repo: z.string().optional(),
70
+ })
71
+ .parse(params);
72
+ const resolved = await resolveOwnerRepo(context, input, 'What GitHub repository should I list milestones for? Please provide the owner and repo name (e.g., owner/repo).');
73
+ if ('error' in resolved)
74
+ return resolved.response;
75
+ const milestones = await resolved.github.getMilestones(resolved.owner, resolved.repo, input.state, input.limit);
76
+ const milestonesWithPercentage = milestones.map((ms) => {
77
+ const total = ms.openIssues + ms.closedIssues;
78
+ const completionPercentage = total > 0 ? Math.round((ms.closedIssues / total) * 100) : 0;
79
+ return { ...ms, completionPercentage };
80
+ });
81
+ return {
82
+ milestones: milestonesWithPercentage,
83
+ count: milestonesWithPercentage.length,
84
+ owner: resolved.owner,
85
+ repo: resolved.repo,
86
+ detectedOwner: resolved.detectedOwner,
87
+ detectedRepo: resolved.detectedRepo,
88
+ };
89
+ }
90
+ catch (err) {
91
+ return formatHandlerError(err);
92
+ }
93
+ },
94
+ },
95
+ {
96
+ name: 'get_github_milestone',
97
+ title: 'Get GitHub Milestone Details',
98
+ description: 'Get detailed information about a specific GitHub milestone including progress and linked issue counts.',
99
+ group: 'github',
100
+ inputSchema: z.object({
101
+ milestone_number: z.number().describe('Milestone number'),
102
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
103
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
104
+ }),
105
+ outputSchema: GitHubMilestoneResultOutputSchema,
106
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
107
+ handler: async (params) => {
108
+ try {
109
+ const input = z
110
+ .object({
111
+ milestone_number: z.number(),
112
+ owner: z.string().optional(),
113
+ repo: z.string().optional(),
114
+ })
115
+ .parse(params);
116
+ const resolved = await resolveOwnerRepo(context, input, 'What GitHub repository is this milestone from? Please provide the owner and repo name (e.g., owner/repo).');
117
+ if ('error' in resolved)
118
+ return resolved.response;
119
+ const milestone = await resolved.github.getMilestone(resolved.owner, resolved.repo, input.milestone_number);
120
+ if (!milestone) {
121
+ return {
122
+ error: `Milestone #${String(input.milestone_number)} not found`,
123
+ owner: resolved.owner,
124
+ repo: resolved.repo,
125
+ detectedOwner: resolved.detectedOwner,
126
+ detectedRepo: resolved.detectedRepo,
127
+ };
128
+ }
129
+ const total = milestone.openIssues + milestone.closedIssues;
130
+ const completionPercentage = total > 0 ? Math.round((milestone.closedIssues / total) * 100) : 0;
131
+ return {
132
+ milestone: { ...milestone, completionPercentage },
133
+ owner: resolved.owner,
134
+ repo: resolved.repo,
135
+ detectedOwner: resolved.detectedOwner,
136
+ detectedRepo: resolved.detectedRepo,
137
+ };
138
+ }
139
+ catch (err) {
140
+ return formatHandlerError(err);
141
+ }
142
+ },
143
+ },
144
+ {
145
+ name: 'create_github_milestone',
146
+ title: 'Create GitHub Milestone',
147
+ description: 'Create a new GitHub milestone for tracking progress toward a project goal.',
148
+ group: 'github',
149
+ inputSchema: z.object({
150
+ title: z.string().min(1).describe('Milestone title'),
151
+ description: z.string().optional().describe('Milestone description'),
152
+ due_on: z.string().optional().describe('Due date in YYYY-MM-DD format (optional)'),
153
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
154
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
155
+ }),
156
+ outputSchema: CreateMilestoneOutputSchema,
157
+ annotations: { readOnlyHint: false, idempotentHint: false, openWorldHint: true },
158
+ handler: async (params) => {
159
+ try {
160
+ const input = z
161
+ .object({
162
+ title: z.string().min(1),
163
+ description: z.string().optional(),
164
+ due_on: z.string().optional(),
165
+ owner: z.string().optional(),
166
+ repo: z.string().optional(),
167
+ })
168
+ .parse(params);
169
+ const resolved = await resolveOwnerRepo(context, input, 'What GitHub repository should I create the milestone in?');
170
+ if ('error' in resolved)
171
+ return resolved.response;
172
+ const dueOn = input.due_on ? `${input.due_on}T08:00:00Z` : undefined;
173
+ const milestone = await resolved.github.createMilestone(resolved.owner, resolved.repo, input.title, input.description, dueOn);
174
+ if (!milestone) {
175
+ return {
176
+ success: false,
177
+ error: 'Failed to create milestone. Check GITHUB_TOKEN permissions.',
178
+ };
179
+ }
180
+ return {
181
+ success: true,
182
+ milestone: { ...milestone, completionPercentage: 0 },
183
+ message: `Created milestone #${String(milestone.number)}: ${milestone.title}`,
184
+ };
185
+ }
186
+ catch (err) {
187
+ return formatHandlerError(err);
188
+ }
189
+ },
190
+ },
191
+ {
192
+ name: 'update_github_milestone',
193
+ title: 'Update GitHub Milestone',
194
+ description: 'Update a GitHub milestone (title, description, due date, or state). Use state "closed" to close a completed milestone.',
195
+ group: 'github',
196
+ inputSchema: z.object({
197
+ milestone_number: z.number().describe('Milestone number to update'),
198
+ title: z.string().optional().describe('New title'),
199
+ description: z.string().optional().describe('New description'),
200
+ due_on: z.string().optional().describe('New due date in YYYY-MM-DD format'),
201
+ state: z.string().optional().describe('Set to "closed" to close the milestone'),
202
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
203
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
204
+ }),
205
+ outputSchema: UpdateMilestoneOutputSchema,
206
+ annotations: { readOnlyHint: false, idempotentHint: false, openWorldHint: true },
207
+ handler: async (params) => {
208
+ try {
209
+ const input = z
210
+ .object({
211
+ milestone_number: z.number(),
212
+ title: z.string().optional(),
213
+ description: z.string().optional(),
214
+ due_on: z.string().optional(),
215
+ state: z.enum(['open', 'closed']).optional(),
216
+ owner: z.string().optional(),
217
+ repo: z.string().optional(),
218
+ })
219
+ .parse(params);
220
+ const resolved = await resolveOwnerRepo(context, input, 'What GitHub repository is this milestone in?');
221
+ if ('error' in resolved)
222
+ return resolved.response;
223
+ const dueOn = input.due_on ? `${input.due_on}T08:00:00Z` : undefined;
224
+ const milestone = await resolved.github.updateMilestone(resolved.owner, resolved.repo, input.milestone_number, {
225
+ title: input.title,
226
+ description: input.description,
227
+ dueOn,
228
+ state: input.state,
229
+ });
230
+ if (!milestone) {
231
+ return {
232
+ success: false,
233
+ error: `Failed to update milestone #${String(input.milestone_number)}. Check that it exists and GITHUB_TOKEN has permissions.`,
234
+ };
235
+ }
236
+ const total = milestone.openIssues + milestone.closedIssues;
237
+ const completionPercentage = total > 0 ? Math.round((milestone.closedIssues / total) * 100) : 0;
238
+ return {
239
+ success: true,
240
+ milestone: { ...milestone, completionPercentage },
241
+ message: `Updated milestone #${String(milestone.number)}: ${milestone.title}`,
242
+ };
243
+ }
244
+ catch (err) {
245
+ return formatHandlerError(err);
246
+ }
247
+ },
248
+ },
249
+ {
250
+ name: 'delete_github_milestone',
251
+ title: 'Delete GitHub Milestone',
252
+ description: 'Permanently delete a GitHub milestone. Issues assigned to the milestone will be un-assigned but not deleted.',
253
+ group: 'github',
254
+ inputSchema: z.object({
255
+ milestone_number: z.number().describe('Milestone number to delete'),
256
+ confirm: z.literal(true).describe('Must be set to true to confirm deletion'),
257
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
258
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect'),
259
+ }),
260
+ outputSchema: DeleteMilestoneOutputSchema,
261
+ annotations: {
262
+ readOnlyHint: false,
263
+ idempotentHint: false,
264
+ destructiveHint: true,
265
+ openWorldHint: true,
266
+ },
267
+ handler: async (params) => {
268
+ try {
269
+ const input = z
270
+ .object({
271
+ milestone_number: z.number(),
272
+ confirm: z.literal(true),
273
+ owner: z.string().optional(),
274
+ repo: z.string().optional(),
275
+ })
276
+ .parse(params);
277
+ const resolved = await resolveOwnerRepo(context, input, 'What GitHub repository is this milestone in?');
278
+ if ('error' in resolved)
279
+ return resolved.response;
280
+ const result = await resolved.github.deleteMilestone(resolved.owner, resolved.repo, input.milestone_number);
281
+ if (!result.success) {
282
+ return {
283
+ success: false,
284
+ milestoneNumber: input.milestone_number,
285
+ message: `Failed to delete milestone #${String(input.milestone_number)}`,
286
+ error: result.error ?? undefined,
287
+ };
288
+ }
289
+ return {
290
+ success: true,
291
+ milestoneNumber: input.milestone_number,
292
+ message: `Deleted milestone #${String(input.milestone_number)}`,
293
+ };
294
+ }
295
+ catch (err) {
296
+ return formatHandlerError(err);
297
+ }
298
+ },
299
+ },
300
+ ];
301
+ }
302
+ //# sourceMappingURL=milestone-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"milestone-tools.js","sourceRoot":"","sources":["../../../../src/handlers/tools/github/milestone-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * GitHub Mutation Tools - Barrel file
3
+ *
4
+ * Composes kanban tools and issue tools into a single export
5
+ * for backward compatibility with existing imports.
6
+ */
7
+ import type { ToolDefinition, ToolContext } from '../../../types/index.js';
8
+ /**
9
+ * Get all GitHub mutation tools (kanban + issue management)
10
+ */
11
+ export declare function getGitHubMutationTools(context: ToolContext): ToolDefinition[];
12
+ //# sourceMappingURL=mutation-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-tools.d.ts","sourceRoot":"","sources":["../../../../src/handlers/tools/github/mutation-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAI1E;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAE7E"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * GitHub Mutation Tools - Barrel file
3
+ *
4
+ * Composes kanban tools and issue tools into a single export
5
+ * for backward compatibility with existing imports.
6
+ */
7
+ import { getKanbanTools } from './kanban-tools.js';
8
+ import { getGitHubIssueTools } from './issue-tools.js';
9
+ /**
10
+ * Get all GitHub mutation tools (kanban + issue management)
11
+ */
12
+ export function getGitHubMutationTools(context) {
13
+ return [...getKanbanTools(context), ...getGitHubIssueTools(context)];
14
+ }
15
+ //# sourceMappingURL=mutation-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-tools.js","sourceRoot":"","sources":["../../../../src/handlers/tools/github/mutation-tools.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IACvD,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAA;AACxE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * GitHub Read Tools - 5 tools
3
+ *
4
+ * Tools: get_github_issues, get_github_prs, get_github_issue, get_github_pr, get_github_context
5
+ */
6
+ import type { ToolDefinition, ToolContext } from '../../../types/index.js';
7
+ export declare function getGitHubReadTools(context: ToolContext): ToolDefinition[];
8
+ //# sourceMappingURL=read-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-tools.d.ts","sourceRoot":"","sources":["../../../../src/handlers/tools/github/read-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AA4D1E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,EAAE,CAoQzE"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * GitHub Read Tools - 5 tools
3
+ *
4
+ * Tools: get_github_issues, get_github_prs, get_github_issue, get_github_pr, get_github_context
5
+ */
6
+ import { z } from 'zod';
7
+ import { formatHandlerError } from '../../../utils/error-helpers.js';
8
+ import { GitHubIssuesListOutputSchema, GitHubIssueResultOutputSchema, GitHubPRsListOutputSchema, GitHubPRResultOutputSchema, GitHubContextOutputSchema, } from './schemas.js';
9
+ // ============================================================================
10
+ // Helper: owner/repo resolution with "STOP" pattern
11
+ // ============================================================================
12
+ async function resolveOwnerRepo(context, input, entityLabel) {
13
+ if (!context.github) {
14
+ return { error: true, response: { error: 'GitHub integration not available' } };
15
+ }
16
+ const repoInfo = await context.github.getRepoInfo();
17
+ const detectedOwner = repoInfo.owner;
18
+ const detectedRepo = repoInfo.repo;
19
+ const owner = input.owner ?? detectedOwner ?? undefined;
20
+ const repo = input.repo ?? detectedRepo ?? undefined;
21
+ if (!owner || !repo) {
22
+ return {
23
+ error: true,
24
+ response: {
25
+ error: `STOP: Could not auto-detect repository. DO NOT GUESS. You MUST ask the user to provide the GitHub owner and repository name.`,
26
+ requiresUserInput: true,
27
+ detectedOwner,
28
+ detectedRepo,
29
+ instruction: `Ask the user: "What GitHub repository ${entityLabel}? Please provide the owner and repo name (e.g., owner/repo)."`,
30
+ },
31
+ };
32
+ }
33
+ return { owner, repo, detectedOwner, detectedRepo, github: context.github };
34
+ }
35
+ // ============================================================================
36
+ // Tool Definitions
37
+ // ============================================================================
38
+ export function getGitHubReadTools(context) {
39
+ return [
40
+ {
41
+ name: 'get_github_issues',
42
+ title: 'Get GitHub Issues',
43
+ description: 'List issues from a GitHub repository. IMPORTANT: Do NOT guess owner/repo values - leave them empty to auto-detect from the current git repository.',
44
+ group: 'github',
45
+ inputSchema: z.object({
46
+ owner: z
47
+ .string()
48
+ .optional()
49
+ .describe('Repository owner - LEAVE EMPTY to auto-detect from git. Only specify if user explicitly provides.'),
50
+ repo: z
51
+ .string()
52
+ .optional()
53
+ .describe('Repository name - LEAVE EMPTY to auto-detect from git. Only specify if user explicitly provides.'),
54
+ state: z.string().optional().default('open'),
55
+ limit: z.number().optional().default(20),
56
+ }),
57
+ outputSchema: GitHubIssuesListOutputSchema,
58
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
59
+ handler: async (params) => {
60
+ try {
61
+ const input = z
62
+ .object({
63
+ owner: z.string().optional(),
64
+ repo: z.string().optional(),
65
+ state: z.enum(['open', 'closed', 'all']).optional().default('open'),
66
+ limit: z.number().optional().default(20),
67
+ })
68
+ .parse(params);
69
+ const resolved = await resolveOwnerRepo(context, input, 'would you like to query');
70
+ if ('error' in resolved)
71
+ return resolved.response;
72
+ const issues = await resolved.github.getIssues(resolved.owner, resolved.repo, input.state, input.limit);
73
+ return {
74
+ owner: resolved.owner,
75
+ repo: resolved.repo,
76
+ detectedOwner: resolved.detectedOwner,
77
+ detectedRepo: resolved.detectedRepo,
78
+ issues,
79
+ count: issues.length,
80
+ };
81
+ }
82
+ catch (err) {
83
+ return formatHandlerError(err);
84
+ }
85
+ },
86
+ },
87
+ {
88
+ name: 'get_github_prs',
89
+ title: 'Get GitHub Pull Requests',
90
+ description: 'List pull requests from a GitHub repository. IMPORTANT: Do NOT guess owner/repo values - leave them empty to auto-detect from the current git repository.',
91
+ group: 'github',
92
+ inputSchema: z.object({
93
+ owner: z
94
+ .string()
95
+ .optional()
96
+ .describe('Repository owner - LEAVE EMPTY to auto-detect from git. Only specify if user explicitly provides.'),
97
+ repo: z
98
+ .string()
99
+ .optional()
100
+ .describe('Repository name - LEAVE EMPTY to auto-detect from git. Only specify if user explicitly provides.'),
101
+ state: z.string().optional().default('open'),
102
+ limit: z.number().optional().default(20),
103
+ }),
104
+ outputSchema: GitHubPRsListOutputSchema,
105
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
106
+ handler: async (params) => {
107
+ try {
108
+ const input = z
109
+ .object({
110
+ owner: z.string().optional(),
111
+ repo: z.string().optional(),
112
+ state: z.enum(['open', 'closed', 'all']).optional().default('open'),
113
+ limit: z.number().optional().default(20),
114
+ })
115
+ .parse(params);
116
+ const resolved = await resolveOwnerRepo(context, input, 'would you like to query');
117
+ if ('error' in resolved)
118
+ return resolved.response;
119
+ const pullRequests = await resolved.github.getPullRequests(resolved.owner, resolved.repo, input.state, input.limit);
120
+ return {
121
+ owner: resolved.owner,
122
+ repo: resolved.repo,
123
+ detectedOwner: resolved.detectedOwner,
124
+ detectedRepo: resolved.detectedRepo,
125
+ pullRequests,
126
+ count: pullRequests.length,
127
+ };
128
+ }
129
+ catch (err) {
130
+ return formatHandlerError(err);
131
+ }
132
+ },
133
+ },
134
+ {
135
+ name: 'get_github_issue',
136
+ title: 'Get GitHub Issue Details',
137
+ description: 'Get detailed information about a specific GitHub issue. IMPORTANT: Do NOT guess owner/repo values - leave them empty to auto-detect from the current git repository.',
138
+ group: 'github',
139
+ inputSchema: z.object({
140
+ issue_number: z.number(),
141
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
142
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
143
+ }),
144
+ outputSchema: GitHubIssueResultOutputSchema,
145
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
146
+ handler: async (params) => {
147
+ try {
148
+ const input = z
149
+ .object({
150
+ issue_number: z.number(),
151
+ owner: z.string().optional(),
152
+ repo: z.string().optional(),
153
+ })
154
+ .parse(params);
155
+ const resolved = await resolveOwnerRepo(context, input, 'is this issue from');
156
+ if ('error' in resolved)
157
+ return resolved.response;
158
+ const issue = await resolved.github.getIssue(resolved.owner, resolved.repo, input.issue_number);
159
+ if (!issue) {
160
+ return {
161
+ error: `Issue #${String(input.issue_number)} not found`,
162
+ owner: resolved.owner,
163
+ repo: resolved.repo,
164
+ detectedOwner: resolved.detectedOwner,
165
+ detectedRepo: resolved.detectedRepo,
166
+ };
167
+ }
168
+ return {
169
+ issue,
170
+ owner: resolved.owner,
171
+ repo: resolved.repo,
172
+ detectedOwner: resolved.detectedOwner,
173
+ detectedRepo: resolved.detectedRepo,
174
+ };
175
+ }
176
+ catch (err) {
177
+ return formatHandlerError(err);
178
+ }
179
+ },
180
+ },
181
+ {
182
+ name: 'get_github_pr',
183
+ title: 'Get GitHub PR Details',
184
+ description: 'Get detailed information about a specific GitHub pull request. IMPORTANT: Do NOT guess owner/repo values - leave them empty to auto-detect from the current git repository.',
185
+ group: 'github',
186
+ inputSchema: z.object({
187
+ pr_number: z.number(),
188
+ owner: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
189
+ repo: z.string().optional().describe('LEAVE EMPTY to auto-detect from git'),
190
+ }),
191
+ outputSchema: GitHubPRResultOutputSchema,
192
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
193
+ handler: async (params) => {
194
+ try {
195
+ const input = z
196
+ .object({
197
+ pr_number: z.number(),
198
+ owner: z.string().optional(),
199
+ repo: z.string().optional(),
200
+ })
201
+ .parse(params);
202
+ const resolved = await resolveOwnerRepo(context, input, 'is this PR from');
203
+ if ('error' in resolved)
204
+ return resolved.response;
205
+ const pullRequest = await resolved.github.getPullRequest(resolved.owner, resolved.repo, input.pr_number);
206
+ if (!pullRequest) {
207
+ return {
208
+ error: `PR #${String(input.pr_number)} not found`,
209
+ owner: resolved.owner,
210
+ repo: resolved.repo,
211
+ detectedOwner: resolved.detectedOwner,
212
+ detectedRepo: resolved.detectedRepo,
213
+ };
214
+ }
215
+ return {
216
+ pullRequest,
217
+ owner: resolved.owner,
218
+ repo: resolved.repo,
219
+ detectedOwner: resolved.detectedOwner,
220
+ detectedRepo: resolved.detectedRepo,
221
+ };
222
+ }
223
+ catch (err) {
224
+ return formatHandlerError(err);
225
+ }
226
+ },
227
+ },
228
+ {
229
+ name: 'get_github_context',
230
+ title: 'Get GitHub Repository Context',
231
+ description: 'Get current repository context including branch, open issues, and open PRs. Only counts OPEN items (closed items excluded).',
232
+ group: 'github',
233
+ inputSchema: z.object({}),
234
+ outputSchema: GitHubContextOutputSchema,
235
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: true },
236
+ handler: async (_params) => {
237
+ try {
238
+ if (!context.github) {
239
+ return { error: 'GitHub integration not available' };
240
+ }
241
+ const ctx = await context.github.getRepoContext();
242
+ return {
243
+ repoName: ctx.repoName,
244
+ branch: ctx.branch,
245
+ commit: ctx.commit,
246
+ remoteUrl: ctx.remoteUrl,
247
+ issues: ctx.issues,
248
+ pullRequests: ctx.pullRequests,
249
+ issueCount: ctx.issues.length,
250
+ prCount: ctx.pullRequests.length,
251
+ };
252
+ }
253
+ catch (err) {
254
+ return formatHandlerError(err);
255
+ }
256
+ },
257
+ },
258
+ ];
259
+ }
260
+ //# sourceMappingURL=read-tools.js.map