agentsys 5.0.3 → 5.1.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 (264) hide show
  1. package/.claude-plugin/marketplace.json +21 -14
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/AGENTS.md +2 -1
  4. package/CHANGELOG.md +18 -0
  5. package/README.md +7 -6
  6. package/adapters/codex/skills/agnix/SKILL.md +0 -1
  7. package/adapters/codex/skills/audit-project/SKILL.md +0 -1
  8. package/adapters/codex/skills/audit-project-agents/SKILL.md +0 -1
  9. package/adapters/codex/skills/audit-project-github/SKILL.md +0 -1
  10. package/adapters/codex/skills/consult/SKILL.md +132 -57
  11. package/adapters/codex/skills/debate/SKILL.md +214 -0
  12. package/adapters/codex/skills/delivery-approval/SKILL.md +0 -1
  13. package/adapters/codex/skills/deslop/SKILL.md +0 -1
  14. package/adapters/codex/skills/drift-detect/SKILL.md +0 -1
  15. package/adapters/codex/skills/enhance/SKILL.md +0 -1
  16. package/adapters/codex/skills/learn/SKILL.md +0 -1
  17. package/adapters/codex/skills/next-task/SKILL.md +0 -1
  18. package/adapters/codex/skills/perf/SKILL.md +0 -1
  19. package/adapters/codex/skills/repo-map/SKILL.md +0 -1
  20. package/adapters/codex/skills/ship/SKILL.md +0 -1
  21. package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +0 -1
  22. package/adapters/codex/skills/ship-deployment/SKILL.md +0 -1
  23. package/adapters/codex/skills/ship-error-handling/SKILL.md +0 -1
  24. package/adapters/codex/skills/sync-docs/SKILL.md +0 -1
  25. package/adapters/opencode/agents/agent-enhancer.md +0 -1
  26. package/adapters/opencode/agents/agnix-agent.md +0 -1
  27. package/adapters/opencode/agents/ci-fixer.md +0 -1
  28. package/adapters/opencode/agents/ci-monitor.md +0 -1
  29. package/adapters/opencode/agents/claudemd-enhancer.md +0 -1
  30. package/adapters/opencode/agents/consult-agent.md +122 -30
  31. package/adapters/opencode/agents/cross-file-enhancer.md +0 -1
  32. package/adapters/opencode/agents/debate-orchestrator.md +169 -0
  33. package/adapters/opencode/agents/delivery-validator.md +0 -1
  34. package/adapters/opencode/agents/deslop-agent.md +0 -1
  35. package/adapters/opencode/agents/docs-enhancer.md +0 -1
  36. package/adapters/opencode/agents/exploration-agent.md +0 -1
  37. package/adapters/opencode/agents/hooks-enhancer.md +0 -1
  38. package/adapters/opencode/agents/implementation-agent.md +0 -1
  39. package/adapters/opencode/agents/learn-agent.md +0 -1
  40. package/adapters/opencode/agents/map-validator.md +0 -1
  41. package/adapters/opencode/agents/perf-analyzer.md +0 -1
  42. package/adapters/opencode/agents/perf-code-paths.md +0 -1
  43. package/adapters/opencode/agents/perf-investigation-logger.md +0 -1
  44. package/adapters/opencode/agents/perf-orchestrator.md +0 -1
  45. package/adapters/opencode/agents/perf-theory-gatherer.md +0 -1
  46. package/adapters/opencode/agents/perf-theory-tester.md +0 -1
  47. package/adapters/opencode/agents/plan-synthesizer.md +0 -1
  48. package/adapters/opencode/agents/planning-agent.md +0 -1
  49. package/adapters/opencode/agents/plugin-enhancer.md +0 -1
  50. package/adapters/opencode/agents/prompt-enhancer.md +0 -1
  51. package/adapters/opencode/agents/simple-fixer.md +0 -1
  52. package/adapters/opencode/agents/skills-enhancer.md +0 -1
  53. package/adapters/opencode/agents/sync-docs-agent.md +0 -1
  54. package/adapters/opencode/agents/task-discoverer.md +0 -1
  55. package/adapters/opencode/agents/test-coverage-checker.md +0 -1
  56. package/adapters/opencode/agents/worktree-manager.md +0 -1
  57. package/adapters/opencode/commands/agnix.md +0 -1
  58. package/adapters/opencode/commands/audit-project-agents.md +0 -1
  59. package/adapters/opencode/commands/audit-project-github.md +0 -1
  60. package/adapters/opencode/commands/audit-project.md +0 -1
  61. package/adapters/opencode/commands/consult.md +133 -57
  62. package/adapters/opencode/commands/debate.md +224 -0
  63. package/adapters/opencode/commands/delivery-approval.md +0 -1
  64. package/adapters/opencode/commands/deslop.md +0 -1
  65. package/adapters/opencode/commands/drift-detect.md +0 -1
  66. package/adapters/opencode/commands/enhance.md +0 -1
  67. package/adapters/opencode/commands/learn.md +0 -1
  68. package/adapters/opencode/commands/next-task.md +0 -1
  69. package/adapters/opencode/commands/perf.md +0 -1
  70. package/adapters/opencode/commands/repo-map.md +0 -1
  71. package/adapters/opencode/commands/ship-ci-review-loop.md +0 -1
  72. package/adapters/opencode/commands/ship-deployment.md +0 -1
  73. package/adapters/opencode/commands/ship-error-handling.md +0 -1
  74. package/adapters/opencode/commands/ship.md +0 -1
  75. package/adapters/opencode/commands/sync-docs.md +0 -1
  76. package/adapters/opencode/skills/agnix/SKILL.md +1 -2
  77. package/adapters/opencode/skills/consult/SKILL.md +33 -23
  78. package/adapters/opencode/skills/debate/SKILL.md +245 -0
  79. package/adapters/opencode/skills/deslop/SKILL.md +1 -2
  80. package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -2
  81. package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -2
  82. package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -2
  83. package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -2
  84. package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -2
  85. package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -2
  86. package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -2
  87. package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -2
  88. package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -2
  89. package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -2
  90. package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -2
  91. package/adapters/opencode/skills/learn/SKILL.md +1 -2
  92. package/adapters/opencode/skills/orchestrate-review/SKILL.md +0 -1
  93. package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -2
  94. package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -2
  95. package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -2
  96. package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -2
  97. package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -2
  98. package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -2
  99. package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -2
  100. package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -2
  101. package/adapters/opencode/skills/repo-mapping/SKILL.md +1 -2
  102. package/adapters/opencode/skills/sync-docs/SKILL.md +1 -2
  103. package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -2
  104. package/lib/adapter-transforms.js +24 -4
  105. package/package.json +1 -1
  106. package/plugins/agnix/.claude-plugin/plugin.json +1 -1
  107. package/plugins/agnix/skills/agnix/SKILL.md +1 -1
  108. package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
  109. package/plugins/audit-project/lib/adapter-transforms.js +24 -4
  110. package/plugins/consult/.claude-plugin/plugin.json +1 -1
  111. package/plugins/consult/agents/consult-agent.md +122 -29
  112. package/plugins/consult/commands/consult.md +135 -58
  113. package/plugins/consult/skills/consult/SKILL.md +31 -20
  114. package/plugins/debate/.claude-plugin/plugin.json +21 -0
  115. package/plugins/debate/agents/debate-orchestrator.md +175 -0
  116. package/plugins/debate/commands/debate.md +221 -0
  117. package/plugins/debate/lib/adapter-transforms.js +298 -0
  118. package/plugins/debate/lib/collectors/codebase.js +392 -0
  119. package/plugins/debate/lib/collectors/docs-patterns.js +713 -0
  120. package/plugins/debate/lib/collectors/documentation.js +219 -0
  121. package/plugins/debate/lib/collectors/github.js +330 -0
  122. package/plugins/debate/lib/collectors/index.js +126 -0
  123. package/plugins/debate/lib/config/index.js +14 -0
  124. package/plugins/debate/lib/cross-platform/index.js +539 -0
  125. package/plugins/debate/lib/discovery/index.js +352 -0
  126. package/plugins/debate/lib/drift-detect/collectors.js +37 -0
  127. package/plugins/debate/lib/enhance/agent-analyzer.js +421 -0
  128. package/plugins/debate/lib/enhance/agent-patterns.js +571 -0
  129. package/plugins/debate/lib/enhance/auto-suppression.js +622 -0
  130. package/plugins/debate/lib/enhance/benchmark.js +417 -0
  131. package/plugins/debate/lib/enhance/cross-file-analyzer.js +930 -0
  132. package/plugins/debate/lib/enhance/cross-file-patterns.js +370 -0
  133. package/plugins/debate/lib/enhance/docs-analyzer.js +325 -0
  134. package/plugins/debate/lib/enhance/docs-patterns.js +671 -0
  135. package/plugins/debate/lib/enhance/fixer.js +721 -0
  136. package/plugins/debate/lib/enhance/hook-analyzer.js +135 -0
  137. package/plugins/debate/lib/enhance/hook-patterns.js +40 -0
  138. package/plugins/debate/lib/enhance/index.js +127 -0
  139. package/plugins/debate/lib/enhance/plugin-analyzer.js +402 -0
  140. package/plugins/debate/lib/enhance/plugin-patterns.js +326 -0
  141. package/plugins/debate/lib/enhance/projectmemory-analyzer.js +551 -0
  142. package/plugins/debate/lib/enhance/projectmemory-patterns.js +617 -0
  143. package/plugins/debate/lib/enhance/prompt-analyzer.js +457 -0
  144. package/plugins/debate/lib/enhance/prompt-patterns.js +1484 -0
  145. package/plugins/debate/lib/enhance/reporter.js +1348 -0
  146. package/plugins/debate/lib/enhance/security-patterns.js +284 -0
  147. package/plugins/debate/lib/enhance/skill-analyzer.js +182 -0
  148. package/plugins/debate/lib/enhance/skill-patterns.js +147 -0
  149. package/plugins/debate/lib/enhance/suppression.js +352 -0
  150. package/plugins/debate/lib/enhance/tool-patterns.js +373 -0
  151. package/plugins/debate/lib/index.js +270 -0
  152. package/plugins/debate/lib/patterns/cli-enhancers.js +611 -0
  153. package/plugins/debate/lib/patterns/pipeline.js +948 -0
  154. package/plugins/debate/lib/patterns/review-patterns.js +558 -0
  155. package/plugins/debate/lib/patterns/slop-analyzers.js +2305 -0
  156. package/plugins/debate/lib/patterns/slop-patterns.js +1187 -0
  157. package/plugins/debate/lib/perf/analyzer/index.js +22 -0
  158. package/plugins/debate/lib/perf/argument-parser.js +105 -0
  159. package/plugins/debate/lib/perf/baseline-comparator.js +50 -0
  160. package/plugins/debate/lib/perf/baseline-store.js +127 -0
  161. package/plugins/debate/lib/perf/benchmark-runner.js +404 -0
  162. package/plugins/debate/lib/perf/breaking-point-finder.js +52 -0
  163. package/plugins/debate/lib/perf/breaking-point-runner.js +60 -0
  164. package/plugins/debate/lib/perf/checkpoint.js +123 -0
  165. package/plugins/debate/lib/perf/code-paths.js +86 -0
  166. package/plugins/debate/lib/perf/consolidation.js +37 -0
  167. package/plugins/debate/lib/perf/constraint-runner.js +71 -0
  168. package/plugins/debate/lib/perf/experiment-runner.js +32 -0
  169. package/plugins/debate/lib/perf/index.js +41 -0
  170. package/plugins/debate/lib/perf/investigation-state.js +874 -0
  171. package/plugins/debate/lib/perf/optimization-runner.js +79 -0
  172. package/plugins/debate/lib/perf/profilers/go.js +22 -0
  173. package/plugins/debate/lib/perf/profilers/index.js +46 -0
  174. package/plugins/debate/lib/perf/profilers/java.js +23 -0
  175. package/plugins/debate/lib/perf/profilers/node.js +27 -0
  176. package/plugins/debate/lib/perf/profilers/python.js +23 -0
  177. package/plugins/debate/lib/perf/profilers/rust.js +23 -0
  178. package/plugins/debate/lib/perf/profiling-runner.js +75 -0
  179. package/plugins/debate/lib/perf/schemas.js +140 -0
  180. package/plugins/debate/lib/platform/detect-platform.js +413 -0
  181. package/plugins/debate/lib/platform/detection-configs.js +93 -0
  182. package/plugins/debate/lib/platform/state-dir.js +132 -0
  183. package/plugins/debate/lib/platform/verify-tools.js +182 -0
  184. package/plugins/debate/lib/repo-map/cache.js +152 -0
  185. package/plugins/debate/lib/repo-map/concurrency.js +29 -0
  186. package/plugins/debate/lib/repo-map/index.js +222 -0
  187. package/plugins/debate/lib/repo-map/installer.js +212 -0
  188. package/plugins/debate/lib/repo-map/queries/go.js +27 -0
  189. package/plugins/debate/lib/repo-map/queries/index.js +100 -0
  190. package/plugins/debate/lib/repo-map/queries/java.js +38 -0
  191. package/plugins/debate/lib/repo-map/queries/javascript.js +55 -0
  192. package/plugins/debate/lib/repo-map/queries/python.js +24 -0
  193. package/plugins/debate/lib/repo-map/queries/rust.js +73 -0
  194. package/plugins/debate/lib/repo-map/queries/typescript.js +38 -0
  195. package/plugins/debate/lib/repo-map/runner.js +1364 -0
  196. package/plugins/debate/lib/repo-map/updater.js +562 -0
  197. package/plugins/debate/lib/repo-map/usage-analyzer.js +407 -0
  198. package/plugins/debate/lib/schemas/plugin-manifest.schema.json +57 -0
  199. package/plugins/debate/lib/schemas/validator.js +247 -0
  200. package/plugins/debate/lib/sources/custom-handler.js +199 -0
  201. package/plugins/debate/lib/sources/policy-questions.js +246 -0
  202. package/plugins/debate/lib/sources/source-cache.js +165 -0
  203. package/plugins/debate/lib/state/workflow-state.js +576 -0
  204. package/plugins/debate/lib/types/agent-frontmatter.d.ts +134 -0
  205. package/plugins/debate/lib/types/command-frontmatter.d.ts +107 -0
  206. package/plugins/debate/lib/types/hook-frontmatter.d.ts +115 -0
  207. package/plugins/debate/lib/types/index.d.ts +84 -0
  208. package/plugins/debate/lib/types/plugin-manifest.d.ts +102 -0
  209. package/plugins/debate/lib/types/skill-frontmatter.d.ts +89 -0
  210. package/plugins/debate/lib/utils/atomic-write.js +94 -0
  211. package/plugins/debate/lib/utils/cache-manager.js +159 -0
  212. package/plugins/debate/lib/utils/command-parser.js +0 -0
  213. package/plugins/debate/lib/utils/context-optimizer.js +300 -0
  214. package/plugins/debate/lib/utils/deprecation.js +37 -0
  215. package/plugins/debate/lib/utils/shell-escape.js +88 -0
  216. package/plugins/debate/lib/utils/state-helpers.js +61 -0
  217. package/plugins/debate/skills/debate/SKILL.md +264 -0
  218. package/plugins/deslop/.claude-plugin/plugin.json +1 -1
  219. package/plugins/deslop/lib/adapter-transforms.js +24 -4
  220. package/plugins/deslop/skills/deslop/SKILL.md +1 -1
  221. package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
  222. package/plugins/drift-detect/lib/adapter-transforms.js +24 -4
  223. package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
  224. package/plugins/enhance/.claude-plugin/plugin.json +1 -1
  225. package/plugins/enhance/lib/adapter-transforms.js +24 -4
  226. package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
  227. package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
  228. package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
  229. package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
  230. package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
  231. package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
  232. package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
  233. package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
  234. package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
  235. package/plugins/learn/.claude-plugin/plugin.json +1 -1
  236. package/plugins/learn/agents/learn-agent.md +1 -1
  237. package/plugins/learn/lib/adapter-transforms.js +24 -4
  238. package/plugins/learn/skills/learn/SKILL.md +1 -1
  239. package/plugins/next-task/.claude-plugin/plugin.json +1 -1
  240. package/plugins/next-task/agents/exploration-agent.md +1 -1
  241. package/plugins/next-task/lib/adapter-transforms.js +24 -4
  242. package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
  243. package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
  244. package/plugins/perf/.claude-plugin/plugin.json +1 -1
  245. package/plugins/perf/lib/adapter-transforms.js +24 -4
  246. package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
  247. package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
  248. package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
  249. package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
  250. package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
  251. package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
  252. package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
  253. package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
  254. package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
  255. package/plugins/repo-map/lib/adapter-transforms.js +24 -4
  256. package/plugins/ship/.claude-plugin/plugin.json +1 -1
  257. package/plugins/ship/lib/adapter-transforms.js +24 -4
  258. package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
  259. package/plugins/sync-docs/lib/adapter-transforms.js +24 -4
  260. package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
  261. package/scripts/gen-adapters.js +6 -7
  262. package/scripts/generate-docs.js +4 -2
  263. package/scripts/plugins.txt +1 -0
  264. package/site/content.json +6 -6
@@ -0,0 +1,212 @@
1
+ /**
2
+ * ast-grep installation detection and helpers
3
+ *
4
+ * @module lib/repo-map/installer
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { execSync, execFileSync, execFile } = require('child_process');
10
+ const fs = require('fs');
11
+ const path = require('path');
12
+ const { promisify } = require('util');
13
+
14
+ const execFileAsync = promisify(execFile);
15
+
16
+ // Commands to try (sg is the common alias)
17
+ const AST_GREP_COMMANDS = ['sg', 'ast-grep'];
18
+
19
+ function pickCommandPath(pathOutput) {
20
+ if (!pathOutput) return null;
21
+ const candidates = pathOutput.split(/\r?\n/).map(line => line.trim()).filter(Boolean);
22
+ if (candidates.length === 0) return null;
23
+
24
+ if (process.platform !== 'win32') {
25
+ return candidates[0];
26
+ }
27
+
28
+ const exe = candidates.find(candidate => candidate.toLowerCase().endsWith('.exe'));
29
+ if (exe) return exe;
30
+
31
+ const primary = candidates[0];
32
+ if (!primary) return null;
33
+
34
+ const baseDir = path.dirname(primary);
35
+ const npmExe = path.join(baseDir, 'node_modules', '@ast-grep', 'cli', 'sg.exe');
36
+ if (fs.existsSync(npmExe)) return npmExe;
37
+
38
+ return primary;
39
+ }
40
+
41
+ /**
42
+ * Check if ast-grep is installed
43
+ * @returns {Promise<{found: boolean, version?: string, path?: string, command?: string}>}
44
+ */
45
+ async function checkInstalled() {
46
+ for (const cmd of AST_GREP_COMMANDS) {
47
+ try {
48
+ // Try to get version using execFileAsync (no shell, safe from injection)
49
+ const { stdout } = await execFileAsync(cmd, ['--version'], {
50
+ timeout: 5000,
51
+ windowsHide: true,
52
+ shell: process.platform === 'win32' // Windows needs shell for PATH lookup
53
+ });
54
+
55
+ const version = stdout.trim().replace(/^ast-grep\s*/i, '');
56
+
57
+ // Try to get path
58
+ let cmdPath = null;
59
+ try {
60
+ const whereCmd = process.platform === 'win32' ? 'where' : 'which';
61
+ // Use execFileAsync with args array (no shell interpolation)
62
+ const { stdout: pathOut } = await execFileAsync(whereCmd, [cmd], {
63
+ timeout: 5000,
64
+ windowsHide: true,
65
+ shell: process.platform === 'win32'
66
+ });
67
+ cmdPath = pickCommandPath(pathOut);
68
+ } catch {
69
+ // Path lookup failed, but command works
70
+ }
71
+
72
+ return {
73
+ found: true,
74
+ version,
75
+ path: cmdPath,
76
+ command: cmdPath || cmd
77
+ };
78
+ } catch {
79
+ // This command not found, try next
80
+ continue;
81
+ }
82
+ }
83
+
84
+ return { found: false };
85
+ }
86
+
87
+ /**
88
+ * Check if ast-grep is installed (sync version)
89
+ * @returns {{found: boolean, version?: string, command?: string, path?: string}}
90
+ */
91
+ function checkInstalledSync() {
92
+ for (const cmd of AST_GREP_COMMANDS) {
93
+ try {
94
+ // Use execFileSync with args array (no shell interpolation, safe from injection)
95
+ const stdout = execFileSync(cmd, ['--version'], {
96
+ timeout: 5000,
97
+ windowsHide: true,
98
+ encoding: 'utf8',
99
+ stdio: ['pipe', 'pipe', 'pipe'],
100
+ shell: process.platform === 'win32' // Windows needs shell for PATH lookup
101
+ });
102
+
103
+ const version = stdout.trim().replace(/^ast-grep\s*/i, '');
104
+ let cmdPath = null;
105
+
106
+ try {
107
+ const whereCmd = process.platform === 'win32' ? 'where' : 'which';
108
+ // Use execFileSync with args array (no shell interpolation)
109
+ const pathOut = execFileSync(whereCmd, [cmd], {
110
+ timeout: 5000,
111
+ windowsHide: true,
112
+ encoding: 'utf8',
113
+ stdio: ['pipe', 'pipe', 'pipe'],
114
+ shell: process.platform === 'win32'
115
+ });
116
+ cmdPath = pickCommandPath(pathOut);
117
+ } catch {
118
+ // Path lookup failed, but command works
119
+ }
120
+
121
+ return { found: true, version, command: cmdPath || cmd, path: cmdPath };
122
+ } catch {
123
+ continue;
124
+ }
125
+ }
126
+
127
+ return { found: false };
128
+ }
129
+
130
+ /**
131
+ * Get the working ast-grep command
132
+ * @returns {string|null}
133
+ */
134
+ function getCommand() {
135
+ const result = checkInstalledSync();
136
+ return result.found ? result.command : null;
137
+ }
138
+
139
+ /**
140
+ * Get installation instructions for ast-grep
141
+ * @returns {string}
142
+ */
143
+ function getInstallInstructions() {
144
+ return `ast-grep (sg) is required for repo-map functionality.
145
+
146
+ Install using one of these methods:
147
+
148
+ npm: npm install -g @ast-grep/cli
149
+ pip: pip install ast-grep-cli
150
+ brew: brew install ast-grep
151
+ cargo: cargo install ast-grep --locked
152
+ scoop: scoop install main/ast-grep
153
+
154
+ After installation, verify with: sg --version
155
+
156
+ Documentation: https://ast-grep.github.io/`;
157
+ }
158
+
159
+ /**
160
+ * Get a short install suggestion (one line)
161
+ * @returns {string}
162
+ */
163
+ function getShortInstallSuggestion() {
164
+ if (process.platform === 'win32') {
165
+ return 'Install ast-grep: npm i -g @ast-grep/cli (or scoop install ast-grep)';
166
+ } else if (process.platform === 'darwin') {
167
+ return 'Install ast-grep: brew install ast-grep (or npm i -g @ast-grep/cli)';
168
+ } else {
169
+ return 'Install ast-grep: npm i -g @ast-grep/cli (or pip install ast-grep-cli)';
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Get minimum required version
175
+ * @returns {string}
176
+ */
177
+ function getMinimumVersion() {
178
+ return '0.20.0'; // Require at least this version for JSON output support
179
+ }
180
+
181
+ /**
182
+ * Check if installed version meets minimum requirements
183
+ * @param {string} version - Installed version
184
+ * @returns {boolean}
185
+ */
186
+ function meetsMinimumVersion(version) {
187
+ if (!version) return false;
188
+
189
+ // Parse version (e.g., "0.25.0" or "0.25.0-beta.1")
190
+ const match = version.match(/^(\d+)\.(\d+)\.(\d+)/);
191
+ if (!match) return false;
192
+
193
+ const [, major, minor, patch] = match.map(Number);
194
+ const [reqMajor, reqMinor, reqPatch] = getMinimumVersion().split('.').map(Number);
195
+
196
+ if (major > reqMajor) return true;
197
+ if (major < reqMajor) return false;
198
+ if (minor > reqMinor) return true;
199
+ if (minor < reqMinor) return false;
200
+ return patch >= reqPatch;
201
+ }
202
+
203
+ module.exports = {
204
+ checkInstalled,
205
+ checkInstalledSync,
206
+ getCommand,
207
+ getInstallInstructions,
208
+ getShortInstallSuggestion,
209
+ getMinimumVersion,
210
+ meetsMinimumVersion,
211
+ AST_GREP_COMMANDS
212
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Go query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ module.exports = {
8
+ exports: [],
9
+ functions: [
10
+ { pattern: 'func $NAME($$$) { $$$ }', nameVar: 'NAME' },
11
+ { pattern: 'func ($$$) $NAME($$$) { $$$ }', nameVar: 'NAME' }
12
+ ],
13
+ classes: [],
14
+ types: [
15
+ { pattern: 'type $NAME struct { $$$ }', nameVar: 'NAME' },
16
+ { pattern: 'type $NAME interface { $$$ }', nameVar: 'NAME' },
17
+ { pattern: 'type $NAME = $$$', nameVar: 'NAME' }
18
+ ],
19
+ constants: [
20
+ { pattern: 'const $NAME = $$$', nameVar: 'NAME' },
21
+ { pattern: 'const $NAME $TYPE = $$$', nameVar: 'NAME' }
22
+ ],
23
+ imports: [
24
+ { pattern: 'import $SOURCE', sourceVar: 'SOURCE', kind: 'import' },
25
+ { pattern: 'import $NAME $SOURCE', sourceVar: 'SOURCE', kind: 'import' }
26
+ ]
27
+ };
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Language-specific query patterns for ast-grep
3
+ *
4
+ * @module lib/repo-map/queries
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const path = require('path');
10
+
11
+ const javascript = require('./javascript');
12
+ const typescript = require('./typescript');
13
+ const python = require('./python');
14
+ const rust = require('./rust');
15
+ const go = require('./go');
16
+ const java = require('./java');
17
+
18
+ /**
19
+ * Get query patterns for a language
20
+ * @param {string} language - Language name
21
+ * @returns {Object|null}
22
+ */
23
+ function getQueriesForLanguage(language) {
24
+ switch (language) {
25
+ case 'javascript':
26
+ case 'js':
27
+ case 'node':
28
+ return javascript;
29
+ case 'typescript':
30
+ case 'ts':
31
+ return typescript;
32
+ case 'python':
33
+ case 'py':
34
+ return python;
35
+ case 'rust':
36
+ return rust;
37
+ case 'go':
38
+ return go;
39
+ case 'java':
40
+ return java;
41
+ default:
42
+ return null;
43
+ }
44
+ }
45
+
46
+ /**
47
+ * Get base ast-grep language identifier
48
+ * @param {string} language - Language name
49
+ * @returns {string}
50
+ */
51
+ function getSgLanguage(language) {
52
+ switch (language) {
53
+ case 'javascript':
54
+ case 'js':
55
+ case 'node':
56
+ return 'javascript';
57
+ case 'typescript':
58
+ case 'ts':
59
+ return 'typescript';
60
+ case 'python':
61
+ case 'py':
62
+ return 'python';
63
+ case 'rust':
64
+ return 'rust';
65
+ case 'go':
66
+ return 'go';
67
+ case 'java':
68
+ return 'java';
69
+ default:
70
+ return 'javascript';
71
+ }
72
+ }
73
+
74
+ /**
75
+ * Get ast-grep language identifier based on file extension
76
+ * @param {string} filePath - File path
77
+ * @param {string} language - Language name
78
+ * @returns {string}
79
+ */
80
+ function getSgLanguageForFile(filePath, language) {
81
+ const ext = path.extname(filePath).toLowerCase();
82
+
83
+ if (language === 'javascript') {
84
+ if (ext === '.jsx') return 'jsx';
85
+ return 'javascript';
86
+ }
87
+
88
+ if (language === 'typescript') {
89
+ if (ext === '.tsx') return 'tsx';
90
+ return 'typescript';
91
+ }
92
+
93
+ return getSgLanguage(language);
94
+ }
95
+
96
+ module.exports = {
97
+ getQueriesForLanguage,
98
+ getSgLanguage,
99
+ getSgLanguageForFile
100
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Java query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ module.exports = {
8
+ exports: [
9
+ { pattern: 'public class $NAME { $$$ }', kind: 'class', nameVar: 'NAME' },
10
+ { pattern: 'public interface $NAME { $$$ }', kind: 'class', nameVar: 'NAME' },
11
+ { pattern: 'public enum $NAME { $$$ }', kind: 'class', nameVar: 'NAME' },
12
+ { pattern: 'public record $NAME($$$) { $$$ }', kind: 'class', nameVar: 'NAME' },
13
+ { pattern: 'public $RET $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
14
+ { pattern: 'public static $RET $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
15
+ { pattern: 'public $RET $NAME($$$);', kind: 'function', nameVar: 'NAME' }
16
+ ],
17
+ functions: [
18
+ { pattern: 'public $RET $NAME($$$) { $$$ }', nameVar: 'NAME' },
19
+ { pattern: 'public static $RET $NAME($$$) { $$$ }', nameVar: 'NAME' },
20
+ { pattern: 'protected $RET $NAME($$$) { $$$ }', nameVar: 'NAME' },
21
+ { pattern: 'private $RET $NAME($$$) { $$$ }', nameVar: 'NAME' }
22
+ ],
23
+ classes: [
24
+ { pattern: 'class $NAME { $$$ }', nameVar: 'NAME' },
25
+ { pattern: 'interface $NAME { $$$ }', nameVar: 'NAME' },
26
+ { pattern: 'enum $NAME { $$$ }', nameVar: 'NAME' },
27
+ { pattern: 'record $NAME($$$) { $$$ }', nameVar: 'NAME' }
28
+ ],
29
+ types: [],
30
+ constants: [
31
+ { pattern: 'public static final $TYPE $NAME = $$$;', nameVar: 'NAME' },
32
+ { pattern: 'static final $TYPE $NAME = $$$;', nameVar: 'NAME' }
33
+ ],
34
+ imports: [
35
+ { pattern: 'import $SOURCE;', sourceVar: 'SOURCE', kind: 'import' },
36
+ { pattern: 'import static $SOURCE;', sourceVar: 'SOURCE', kind: 'import' }
37
+ ]
38
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * JavaScript query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ module.exports = {
8
+ exports: [
9
+ { pattern: 'export function $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
10
+ { pattern: 'export async function $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
11
+ { pattern: 'export class $NAME { $$$ }', kind: 'class', nameVar: 'NAME' },
12
+ { pattern: 'export const $NAME = $$$', kind: 'constant', nameVar: 'NAME' },
13
+ { pattern: 'export let $NAME = $$$', kind: 'variable', nameVar: 'NAME' },
14
+ { pattern: 'export var $NAME = $$$', kind: 'variable', nameVar: 'NAME' },
15
+ { pattern: 'export default function $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
16
+ { pattern: 'export default class $NAME { $$$ }', kind: 'class', nameVar: 'NAME' },
17
+ { pattern: 'export default function ($$$) { $$$ }', kind: 'function', fallbackName: 'default' },
18
+ { pattern: 'export default class { $$$ }', kind: 'class', fallbackName: 'default' },
19
+ { pattern: 'export default $NAME', kind: 'value', nameVar: 'NAME' },
20
+ { pattern: 'export { $$$ }', kind: 'value', multi: 'exportList' },
21
+ { pattern: 'export { $$$ } from $SOURCE', kind: 're-export', multi: 'exportList', sourceVar: 'SOURCE' },
22
+ { pattern: 'export * from $SOURCE', kind: 're-export', fallbackName: '*', sourceVar: 'SOURCE' },
23
+ { pattern: 'module.exports = $NAME', kind: 'value', nameVar: 'NAME' },
24
+ { pattern: 'module.exports = { $$$ }', kind: 'value', multi: 'objectLiteral' },
25
+ { pattern: 'exports.$NAME = $$$', kind: 'value', nameVar: 'NAME' }
26
+ ],
27
+ functions: [
28
+ { pattern: 'function $NAME($$$) { $$$ }', nameVar: 'NAME' },
29
+ { pattern: 'async function $NAME($$$) { $$$ }', nameVar: 'NAME' },
30
+ { pattern: 'function* $NAME($$$) { $$$ }', nameVar: 'NAME' },
31
+ { pattern: 'async function* $NAME($$$) { $$$ }', nameVar: 'NAME' },
32
+ { pattern: 'const $NAME = ($$$) => $$$', nameVar: 'NAME' },
33
+ { pattern: 'const $NAME = async ($$$) => $$$', nameVar: 'NAME' },
34
+ { pattern: 'const $NAME = function ($$$) { $$$ }', nameVar: 'NAME' },
35
+ { pattern: 'const $NAME = async function ($$$) { $$$ }', nameVar: 'NAME' },
36
+ { pattern: 'let $NAME = ($$$) => $$$', nameVar: 'NAME' },
37
+ { pattern: 'var $NAME = ($$$) => $$$', nameVar: 'NAME' }
38
+ ],
39
+ classes: [
40
+ { pattern: 'class $NAME { $$$ }', nameVar: 'NAME' },
41
+ { pattern: 'const $NAME = class { $$$ }', nameVar: 'NAME' },
42
+ { pattern: 'const $NAME = class $CLASS { $$$ }', nameVar: 'NAME' }
43
+ ],
44
+ types: [],
45
+ constants: [],
46
+ imports: [
47
+ { pattern: 'import $NAME from $SOURCE', sourceVar: 'SOURCE', kind: 'default' },
48
+ { pattern: 'import * as $NAME from $SOURCE', sourceVar: 'SOURCE', kind: 'namespace' },
49
+ { pattern: 'import { $$$ } from $SOURCE', sourceVar: 'SOURCE', kind: 'named' },
50
+ { pattern: 'import $SOURCE', sourceVar: 'SOURCE', kind: 'side-effect' },
51
+ { pattern: 'const $NAME = require($SOURCE)', sourceVar: 'SOURCE', kind: 'require' },
52
+ { pattern: 'const { $$$ } = require($SOURCE)', sourceVar: 'SOURCE', kind: 'require' },
53
+ { pattern: 'require($SOURCE)', sourceVar: 'SOURCE', kind: 'require' }
54
+ ]
55
+ };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Python query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ module.exports = {
8
+ exports: [],
9
+ functions: [
10
+ { pattern: 'def $NAME($$$): $$$', nameVar: 'NAME' },
11
+ { pattern: 'async def $NAME($$$): $$$', nameVar: 'NAME' }
12
+ ],
13
+ classes: [
14
+ { pattern: 'class $NAME($$$): $$$', nameVar: 'NAME' },
15
+ { pattern: 'class $NAME: $$$', nameVar: 'NAME' }
16
+ ],
17
+ types: [],
18
+ constants: [],
19
+ imports: [
20
+ { pattern: 'import $SOURCE', sourceVar: 'SOURCE', kind: 'import', multiSource: true },
21
+ { pattern: 'from $SOURCE import $NAME', sourceVar: 'SOURCE', kind: 'from' },
22
+ { pattern: 'from $SOURCE import ($$$)', sourceVar: 'SOURCE', kind: 'from' }
23
+ ]
24
+ };
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Rust query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ module.exports = {
8
+ exports: [
9
+ { pattern: 'pub fn $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
10
+ { pattern: 'pub(crate) fn $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
11
+ { pattern: 'pub(super) fn $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
12
+ { pattern: 'pub(in $PATH) fn $NAME($$$) { $$$ }', kind: 'function', nameVar: 'NAME' },
13
+ { pattern: 'pub struct $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
14
+ { pattern: 'pub(crate) struct $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
15
+ { pattern: 'pub(super) struct $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
16
+ { pattern: 'pub(in $PATH) struct $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
17
+ { pattern: 'pub enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
18
+ { pattern: 'pub(crate) enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
19
+ { pattern: 'pub(super) enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
20
+ { pattern: 'pub(in $PATH) enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
21
+ { pattern: 'pub trait $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
22
+ { pattern: 'pub(crate) trait $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
23
+ { pattern: 'pub(super) trait $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
24
+ { pattern: 'pub(in $PATH) trait $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
25
+ { pattern: 'pub type $NAME = $$$', kind: 'type', nameVar: 'NAME' },
26
+ { pattern: 'pub(crate) type $NAME = $$$', kind: 'type', nameVar: 'NAME' },
27
+ { pattern: 'pub(super) type $NAME = $$$', kind: 'type', nameVar: 'NAME' },
28
+ { pattern: 'pub(in $PATH) type $NAME = $$$', kind: 'type', nameVar: 'NAME' },
29
+ { pattern: 'pub const $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
30
+ { pattern: 'pub(crate) const $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
31
+ { pattern: 'pub(super) const $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
32
+ { pattern: 'pub(in $PATH) const $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
33
+ { pattern: 'pub static $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
34
+ { pattern: 'pub(crate) static $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
35
+ { pattern: 'pub(super) static $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
36
+ { pattern: 'pub(in $PATH) static $NAME: $TYPE = $$$', kind: 'constant', nameVar: 'NAME' },
37
+ { pattern: 'pub mod $NAME { $$$ }', kind: 'module', nameVar: 'NAME' },
38
+ { pattern: 'pub(crate) mod $NAME { $$$ }', kind: 'module', nameVar: 'NAME' },
39
+ { pattern: 'pub(super) mod $NAME { $$$ }', kind: 'module', nameVar: 'NAME' },
40
+ { pattern: 'pub(in $PATH) mod $NAME { $$$ }', kind: 'module', nameVar: 'NAME' },
41
+ { pattern: 'pub mod $NAME;', kind: 'module', nameVar: 'NAME' }
42
+ ],
43
+ functions: [
44
+ { pattern: 'fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
45
+ { pattern: 'async fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
46
+ { pattern: 'pub fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
47
+ { pattern: 'pub(crate) fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
48
+ { pattern: 'pub(super) fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
49
+ { pattern: 'pub(in $PATH) fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
50
+ { pattern: 'pub async fn $NAME($$$) { $$$ }', nameVar: 'NAME' },
51
+ { pattern: 'pub(crate) async fn $NAME($$$) { $$$ }', nameVar: 'NAME' }
52
+ ],
53
+ classes: [],
54
+ types: [
55
+ { pattern: 'struct $NAME { $$$ }', nameVar: 'NAME' },
56
+ { pattern: 'enum $NAME { $$$ }', nameVar: 'NAME' },
57
+ { pattern: 'trait $NAME { $$$ }', nameVar: 'NAME' },
58
+ { pattern: 'type $NAME = $$$', nameVar: 'NAME' },
59
+ { pattern: 'pub struct $NAME { $$$ }', nameVar: 'NAME' },
60
+ { pattern: 'pub enum $NAME { $$$ }', nameVar: 'NAME' },
61
+ { pattern: 'pub trait $NAME { $$$ }', nameVar: 'NAME' },
62
+ { pattern: 'pub type $NAME = $$$', nameVar: 'NAME' }
63
+ ],
64
+ constants: [
65
+ { pattern: 'const $NAME: $TYPE = $$$', nameVar: 'NAME' },
66
+ { pattern: 'static $NAME: $TYPE = $$$', nameVar: 'NAME' }
67
+ ],
68
+ imports: [
69
+ { pattern: 'use $SOURCE;', sourceVar: 'SOURCE', kind: 'use' },
70
+ { pattern: 'use $SOURCE::{ $$$ };', sourceVar: 'SOURCE', kind: 'use' },
71
+ { pattern: 'use $SOURCE::*;', sourceVar: 'SOURCE', kind: 'use' }
72
+ ]
73
+ };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * TypeScript query patterns for ast-grep
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const javascript = require('./javascript');
8
+
9
+ module.exports = {
10
+ exports: [
11
+ ...javascript.exports,
12
+ { pattern: 'export interface $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
13
+ { pattern: 'export type $NAME = $$$', kind: 'type', nameVar: 'NAME' },
14
+ { pattern: 'export enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
15
+ { pattern: 'export namespace $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
16
+ { pattern: 'export const enum $NAME { $$$ }', kind: 'type', nameVar: 'NAME' },
17
+ { pattern: 'export = $NAME', kind: 'value', nameVar: 'NAME' },
18
+ { pattern: 'export as namespace $NAME', kind: 'namespace', nameVar: 'NAME' }
19
+ ],
20
+ functions: javascript.functions,
21
+ classes: [
22
+ ...javascript.classes,
23
+ { pattern: 'abstract class $NAME { $$$ }', nameVar: 'NAME' }
24
+ ],
25
+ types: [
26
+ { pattern: 'interface $NAME { $$$ }', nameVar: 'NAME' },
27
+ { pattern: 'type $NAME = $$$', nameVar: 'NAME' },
28
+ { pattern: 'enum $NAME { $$$ }', nameVar: 'NAME' },
29
+ { pattern: 'namespace $NAME { $$$ }', nameVar: 'NAME' },
30
+ { pattern: 'const enum $NAME { $$$ }', nameVar: 'NAME' }
31
+ ],
32
+ constants: javascript.constants,
33
+ imports: [
34
+ ...javascript.imports,
35
+ { pattern: 'import type { $$$ } from $SOURCE', sourceVar: 'SOURCE', kind: 'type' },
36
+ { pattern: 'import type $NAME from $SOURCE', sourceVar: 'SOURCE', kind: 'type' }
37
+ ]
38
+ };