memory-journal-mcp 7.0.1 → 7.2.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 (124) hide show
  1. package/README.md +75 -66
  2. package/dist/{chunk-6J4RPJ4I.js → chunk-GR4T3SRW.js} +146 -105
  3. package/dist/{chunk-ARLH46WS.js → chunk-IWKLHSPU.js} +89 -3
  4. package/dist/{chunk-2BJHLTYP.js → chunk-ORV7ZZOE.js} +1086 -86
  5. package/dist/cli.js +30 -4
  6. package/dist/github-integration-2TFMXHIJ.js +1 -0
  7. package/dist/index.d.ts +6 -2
  8. package/dist/index.js +3 -3
  9. package/dist/{tools-FFFGXIKN.js → tools-CXR2FEB2.js} +2 -2
  10. package/package.json +2 -2
  11. package/skills/README.md +77 -0
  12. package/skills/autonomous-dev/SKILL.md +56 -0
  13. package/skills/bin/sync.js +50 -0
  14. package/skills/bun/SKILL.md +156 -0
  15. package/skills/github-commander/SKILL.md +1 -1
  16. package/skills/github-commander/workflows/code-quality-audit.md +7 -5
  17. package/skills/github-commander/workflows/issue-triage.md +13 -4
  18. package/skills/github-commander/workflows/milestone-sprint.md +9 -1
  19. package/skills/github-commander/workflows/perf-audit.md +2 -0
  20. package/skills/github-commander/workflows/pr-review.md +9 -3
  21. package/skills/github-commander/workflows/roadmap-kickoff.md +79 -0
  22. package/skills/github-commander/workflows/security-audit.md +3 -3
  23. package/skills/github-commander/workflows/update-deps.md +2 -2
  24. package/skills/gitlab/SKILL.md +115 -0
  25. package/skills/gitlab/package-lock.json +392 -0
  26. package/skills/gitlab/package.json +14 -0
  27. package/skills/gitlab/scripts/gitlab-client.ts +125 -0
  28. package/skills/gitlab/scripts/gitlab-helper.ts +80 -0
  29. package/skills/golang/SKILL.md +54 -0
  30. package/skills/mysql/SKILL.md +30 -0
  31. package/skills/package.json +48 -0
  32. package/skills/playwright-standard/SKILL.md +58 -0
  33. package/skills/playwright-standard/examples/fixtures.ts +66 -0
  34. package/skills/playwright-standard/examples/type-stubs.d.ts +10 -0
  35. package/skills/playwright-standard/references/advanced-scenarios.md +59 -0
  36. package/skills/playwright-standard/references/infrastructure.md +43 -0
  37. package/skills/postgres/SKILL.md +33 -0
  38. package/skills/react-best-practices/AGENTS.md +2883 -0
  39. package/skills/react-best-practices/README.md +127 -0
  40. package/skills/react-best-practices/SKILL.md +138 -0
  41. package/skills/react-best-practices/metadata.json +17 -0
  42. package/skills/react-best-practices/rules/_sections.md +46 -0
  43. package/skills/react-best-practices/rules/_template.md +28 -0
  44. package/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  45. package/skills/react-best-practices/rules/advanced-init-once.md +42 -0
  46. package/skills/react-best-practices/rules/advanced-use-latest.md +39 -0
  47. package/skills/react-best-practices/rules/async-api-routes.md +35 -0
  48. package/skills/react-best-practices/rules/async-defer-await.md +80 -0
  49. package/skills/react-best-practices/rules/async-dependencies.md +48 -0
  50. package/skills/react-best-practices/rules/async-parallel.md +24 -0
  51. package/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  52. package/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  53. package/skills/react-best-practices/rules/bundle-conditional.md +37 -0
  54. package/skills/react-best-practices/rules/bundle-defer-third-party.md +48 -0
  55. package/skills/react-best-practices/rules/bundle-dynamic-imports.md +34 -0
  56. package/skills/react-best-practices/rules/bundle-preload.md +44 -0
  57. package/skills/react-best-practices/rules/client-event-listeners.md +78 -0
  58. package/skills/react-best-practices/rules/client-localstorage-schema.md +74 -0
  59. package/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  60. package/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  61. package/skills/react-best-practices/rules/js-batch-dom-css.md +110 -0
  62. package/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  63. package/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  64. package/skills/react-best-practices/rules/js-cache-storage.md +68 -0
  65. package/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  66. package/skills/react-best-practices/rules/js-early-exit.md +50 -0
  67. package/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  68. package/skills/react-best-practices/rules/js-index-maps.md +37 -0
  69. package/skills/react-best-practices/rules/js-length-check-first.md +50 -0
  70. package/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  71. package/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  72. package/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  73. package/skills/react-best-practices/rules/rendering-activity.md +24 -0
  74. package/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +38 -0
  75. package/skills/react-best-practices/rules/rendering-conditional-render.md +32 -0
  76. package/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  77. package/skills/react-best-practices/rules/rendering-hoist-jsx.md +36 -0
  78. package/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +72 -0
  79. package/skills/react-best-practices/rules/rendering-hydration-suppress-warning.md +26 -0
  80. package/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  81. package/skills/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  82. package/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  83. package/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  84. package/skills/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  85. package/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  86. package/skills/react-best-practices/rules/rerender-functional-setstate.md +77 -0
  87. package/skills/react-best-practices/rules/rerender-lazy-state-init.md +56 -0
  88. package/skills/react-best-practices/rules/rerender-memo-with-default-value.md +36 -0
  89. package/skills/react-best-practices/rules/rerender-memo.md +44 -0
  90. package/skills/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  91. package/skills/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  92. package/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  93. package/skills/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  94. package/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  95. package/skills/react-best-practices/rules/server-auth-actions.md +96 -0
  96. package/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  97. package/skills/react-best-practices/rules/server-cache-react.md +76 -0
  98. package/skills/react-best-practices/rules/server-dedup-props.md +65 -0
  99. package/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  100. package/skills/react-best-practices/rules/server-serialization.md +38 -0
  101. package/skills/rust/SKILL.md +86 -0
  102. package/skills/shadcn-ui/SKILL.md +72 -0
  103. package/skills/skill-builder/SKILL.md +457 -0
  104. package/skills/skill-builder/checklist.md +65 -0
  105. package/skills/sqlite/SKILL.md +38 -0
  106. package/skills/typescript/SKILL.md +453 -0
  107. package/skills/typescript/assets/eslint-template.js +102 -0
  108. package/skills/typescript/assets/tsconfig-template.json +45 -0
  109. package/skills/typescript/references/enterprise-patterns.md +531 -0
  110. package/skills/typescript/references/generics.md +493 -0
  111. package/skills/typescript/references/nestjs-integration.md +579 -0
  112. package/skills/typescript/references/react-integration.md +616 -0
  113. package/skills/typescript/references/toolchain.md +547 -0
  114. package/skills/typescript/references/type-system.md +481 -0
  115. package/skills/vitest-standard/SKILL.md +82 -0
  116. package/skills/vitest-standard/examples/service-mock.ts +60 -0
  117. package/skills/vitest-standard/examples/tdd-calculator.ts +41 -0
  118. package/skills/vitest-standard/examples/type-stubs.d.ts +18 -0
  119. package/skills/vitest-standard/references/async-and-errors.md +58 -0
  120. package/skills/vitest-standard/references/coverage-and-config.md +53 -0
  121. package/skills/vitest-standard/references/mocking.md +61 -0
  122. package/skills/vitest-standard/references/tdd-patterns.md +60 -0
  123. package/dist/github-integration-PDRLXKGM.js +0 -1
  124. package/skills/github-commander/workflows/full-audit.md +0 -134
@@ -222,6 +222,13 @@ function assertNoPathTraversal(filename) {
222
222
  throw new PathTraversalError(filename);
223
223
  }
224
224
  }
225
+ function assertSafeDirectoryPath(dirPath) {
226
+ const normalized = dirPath.replace(/\\/g, "/");
227
+ const segments = normalized.split("/");
228
+ if (segments.some((s) => s === "..")) {
229
+ throw new PathTraversalError(dirPath);
230
+ }
231
+ }
225
232
  var TOKEN_PATTERNS = [
226
233
  // GitHub personal access tokens (classic and fine-grained)
227
234
  /ghp_[A-Za-z0-9_]{36,}/g,
@@ -489,6 +496,40 @@ var IssuesManager = class {
489
496
  return null;
490
497
  }
491
498
  }
499
+ async getIssueComments(owner, repo, issueNumber, limit = 30) {
500
+ const _limit = Math.min(limit, 100);
501
+ if (_limit <= 0) return [];
502
+ if (!this.client.octokit) {
503
+ return [];
504
+ }
505
+ const cacheKey = `issue-comments:${owner}:${repo}:${String(issueNumber)}:${String(_limit)}`;
506
+ const cached = this.client.getCached(cacheKey);
507
+ if (cached) return cached;
508
+ try {
509
+ const response = await this.client.octokit.issues.listComments({
510
+ owner,
511
+ repo,
512
+ issue_number: issueNumber,
513
+ per_page: _limit,
514
+ sort: "created",
515
+ direction: "asc"
516
+ });
517
+ const comments = response.data.slice(0, _limit).map((comment) => ({
518
+ author: comment.user?.login ?? "unknown",
519
+ body: comment.body ?? "",
520
+ createdAt: comment.created_at
521
+ }));
522
+ this.client.setCache(cacheKey, comments);
523
+ return comments;
524
+ } catch (error) {
525
+ logger.error("Failed to get issue comments", {
526
+ module: "GitHub",
527
+ entityId: issueNumber,
528
+ error: error instanceof Error ? error.message : String(error)
529
+ });
530
+ return [];
531
+ }
532
+ }
492
533
  async createIssue(owner, repo, title, body, labels, assignees, milestone) {
493
534
  if (!this.client.octokit) {
494
535
  logger.error("Cannot create issue: GitHub API not available", { module: "GitHub" });
@@ -1027,7 +1068,9 @@ var ProjectsManager = class {
1027
1068
  });
1028
1069
  return { success: false, error: errorMessage };
1029
1070
  } finally {
1030
- this.client.invalidateCache("kanban:");
1071
+ if (typeof this.client.invalidateCache === "function") {
1072
+ this.client.invalidateCache("kanban:");
1073
+ }
1031
1074
  }
1032
1075
  }
1033
1076
  async addProjectItem(projectId, contentId) {
@@ -1063,7 +1106,44 @@ var ProjectsManager = class {
1063
1106
  });
1064
1107
  return { success: false, error: errorMessage };
1065
1108
  } finally {
1066
- this.client.invalidateCache("kanban:");
1109
+ if (typeof this.client.invalidateCache === "function") {
1110
+ this.client.invalidateCache("kanban:");
1111
+ }
1112
+ }
1113
+ }
1114
+ async deleteProjectItem(projectId, itemId) {
1115
+ if (!this.client.graphqlWithAuth) {
1116
+ return { success: false, error: "GraphQL not available - no token" };
1117
+ }
1118
+ try {
1119
+ const mutation = `
1120
+ mutation($projectId: ID!, $itemId: ID!) {
1121
+ deleteProjectV2Item(input: { projectId: $projectId, itemId: $itemId }) {
1122
+ deletedItemId
1123
+ }
1124
+ }
1125
+ `;
1126
+ await this.client.graphqlWithAuth(mutation, {
1127
+ projectId,
1128
+ itemId
1129
+ });
1130
+ logger.info("Deleted project item", {
1131
+ module: "GitHub",
1132
+ context: { projectId, itemId }
1133
+ });
1134
+ return { success: true };
1135
+ } catch (error) {
1136
+ const errorMessage = error instanceof Error ? error.message : String(error);
1137
+ logger.error("Failed to delete item from project", {
1138
+ module: "GitHub",
1139
+ context: { projectId, itemId },
1140
+ error: errorMessage
1141
+ });
1142
+ return { success: false, error: errorMessage };
1143
+ } finally {
1144
+ if (typeof this.client.invalidateCache === "function") {
1145
+ this.client.invalidateCache("kanban:");
1146
+ }
1067
1147
  }
1068
1148
  }
1069
1149
  };
@@ -1533,6 +1613,9 @@ var GitHubIntegration = class {
1533
1613
  async getIssue(owner, repo, issueNumber) {
1534
1614
  return this.issuesManager.getIssue(owner, repo, issueNumber);
1535
1615
  }
1616
+ async getIssueComments(owner, repo, issueNumber, limit = 30) {
1617
+ return this.issuesManager.getIssueComments(owner, repo, issueNumber, limit);
1618
+ }
1536
1619
  async createIssue(owner, repo, title, body, labels, assignees, milestone) {
1537
1620
  return this.issuesManager.createIssue(
1538
1621
  owner,
@@ -1627,6 +1710,9 @@ var GitHubIntegration = class {
1627
1710
  async addProjectItem(projectId, contentId) {
1628
1711
  return this.projectsManager.addProjectItem(projectId, contentId);
1629
1712
  }
1713
+ async deleteProjectItem(projectId, itemId) {
1714
+ return this.projectsManager.deleteProjectItem(projectId, itemId);
1715
+ }
1630
1716
  async getMilestones(owner, repo, state = "open", limit = 20) {
1631
1717
  return this.milestonesManager.getMilestones(owner, repo, state, limit);
1632
1718
  }
@@ -1656,4 +1742,4 @@ var GitHubIntegration = class {
1656
1742
  }
1657
1743
  };
1658
1744
 
1659
- export { ConfigurationError, ConnectionError, GitHubIntegration, MemoryJournalMcpError, QueryError, ResourceNotFoundError, ValidationError, assertNoPathTraversal, logger, matchSuggestion, resolveAuthor, validateDateFormatPattern };
1745
+ export { ConfigurationError, ConnectionError, GitHubIntegration, MemoryJournalMcpError, QueryError, ResourceNotFoundError, ValidationError, assertNoPathTraversal, assertSafeDirectoryPath, logger, matchSuggestion, resolveAuthor, validateDateFormatPattern };