@hailer/mcp 1.1.11 → 1.1.13

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 (252) hide show
  1. package/dist/app.js +18 -5
  2. package/dist/bot/bot-config.d.ts +12 -1
  3. package/dist/bot/bot-config.js +98 -14
  4. package/dist/bot/bot-manager.d.ts +13 -3
  5. package/dist/bot/bot-manager.js +80 -25
  6. package/dist/bot/bot.d.ts +46 -0
  7. package/dist/bot/bot.js +542 -166
  8. package/dist/bot/services/message-classifier.js +17 -0
  9. package/dist/bot/services/permission-guard.d.ts +52 -0
  10. package/dist/bot/services/permission-guard.js +149 -0
  11. package/dist/bot/services/types.d.ts +5 -0
  12. package/dist/bot/services/typing-indicator.d.ts +6 -1
  13. package/dist/bot/services/typing-indicator.js +19 -3
  14. package/dist/config.d.ts +6 -1
  15. package/dist/config.js +43 -0
  16. package/dist/core.js +3 -6
  17. package/dist/mcp/UserContextCache.d.ts +5 -0
  18. package/dist/mcp/UserContextCache.js +51 -19
  19. package/dist/mcp/hailer-clients.d.ts +19 -1
  20. package/dist/mcp/hailer-clients.js +157 -20
  21. package/dist/mcp/session-store.d.ts +68 -0
  22. package/dist/mcp/session-store.js +169 -0
  23. package/dist/mcp/signal-handler.js +12 -12
  24. package/dist/mcp/tool-registry.d.ts +17 -4
  25. package/dist/mcp/tool-registry.js +37 -7
  26. package/dist/mcp/tools/activity.js +99 -7
  27. package/dist/mcp/tools/app-scaffold.js +304 -336
  28. package/dist/mcp/tools/company.d.ts +9 -0
  29. package/dist/mcp/tools/company.js +88 -0
  30. package/dist/mcp/tools/discussion.js +68 -0
  31. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  32. package/dist/mcp/tools/workflow-permissions.js +204 -0
  33. package/dist/mcp/tools/workflow.js +57 -18
  34. package/dist/mcp/utils/index.d.ts +2 -0
  35. package/dist/mcp/utils/index.js +12 -1
  36. package/dist/mcp/utils/role-utils.d.ts +74 -0
  37. package/dist/mcp/utils/role-utils.js +151 -0
  38. package/dist/mcp/utils/types.d.ts +43 -1
  39. package/dist/mcp/utils/types.js +14 -0
  40. package/dist/mcp/webhook-handler.d.ts +6 -0
  41. package/dist/mcp/webhook-handler.js +11 -0
  42. package/dist/mcp-server.d.ts +23 -2
  43. package/dist/mcp-server.js +639 -111
  44. package/dist/plugins/vipunen/client.d.ts +150 -0
  45. package/dist/plugins/vipunen/client.js +535 -0
  46. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  47. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  48. package/dist/plugins/vipunen/index.d.ts +41 -0
  49. package/dist/plugins/vipunen/index.js +88 -0
  50. package/dist/plugins/vipunen/tools.d.ts +26 -0
  51. package/dist/plugins/vipunen/tools.js +501 -0
  52. package/package.json +2 -1
  53. package/.claude/.context-watchdog.json +0 -1
  54. package/.claude/.session-checked +0 -1
  55. package/.claude/CLAUDE.md +0 -370
  56. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  57. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  58. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  59. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  60. package/.claude/agents/agent-code-simplifier.md +0 -53
  61. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  62. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  63. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  64. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  65. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  66. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  67. package/.claude/agents/agent-ivan-monolith.md +0 -154
  68. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  69. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  70. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  71. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  72. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  73. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  74. package/.claude/agents/agent-permissions-handler.md +0 -208
  75. package/.claude/agents/agent-simple-writer.md +0 -48
  76. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  77. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  78. package/.claude/agents/agent-ui-designer.md +0 -100
  79. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  80. package/.claude/agents/agent-web-search.md +0 -55
  81. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  82. package/.claude/agents/agent-zara-zapier.md +0 -159
  83. package/.claude/commands/app-squad.md +0 -135
  84. package/.claude/commands/audit-squad.md +0 -158
  85. package/.claude/commands/autoplan.md +0 -563
  86. package/.claude/commands/cleanup-squad.md +0 -98
  87. package/.claude/commands/config-squad.md +0 -106
  88. package/.claude/commands/crud-squad.md +0 -87
  89. package/.claude/commands/data-squad.md +0 -97
  90. package/.claude/commands/debug-squad.md +0 -303
  91. package/.claude/commands/doc-squad.md +0 -65
  92. package/.claude/commands/handoff.md +0 -137
  93. package/.claude/commands/health.md +0 -49
  94. package/.claude/commands/help.md +0 -29
  95. package/.claude/commands/help:agents.md +0 -151
  96. package/.claude/commands/help:commands.md +0 -78
  97. package/.claude/commands/help:faq.md +0 -79
  98. package/.claude/commands/help:plugins.md +0 -50
  99. package/.claude/commands/help:skills.md +0 -93
  100. package/.claude/commands/help:tools.md +0 -75
  101. package/.claude/commands/hotfix-squad.md +0 -112
  102. package/.claude/commands/integration-squad.md +0 -82
  103. package/.claude/commands/janitor-squad.md +0 -167
  104. package/.claude/commands/learn-auto.md +0 -120
  105. package/.claude/commands/learn.md +0 -120
  106. package/.claude/commands/mcp-list.md +0 -27
  107. package/.claude/commands/onboard-squad.md +0 -140
  108. package/.claude/commands/plan-workspace.md +0 -732
  109. package/.claude/commands/prd.md +0 -130
  110. package/.claude/commands/project-status.md +0 -82
  111. package/.claude/commands/publish.md +0 -138
  112. package/.claude/commands/recap.md +0 -69
  113. package/.claude/commands/restore.md +0 -64
  114. package/.claude/commands/review-squad.md +0 -152
  115. package/.claude/commands/save.md +0 -24
  116. package/.claude/commands/stats.md +0 -19
  117. package/.claude/commands/swarm.md +0 -210
  118. package/.claude/commands/tool-builder.md +0 -39
  119. package/.claude/commands/ws-pull.md +0 -44
  120. package/.claude/hooks/_shared-memory.cjs +0 -305
  121. package/.claude/hooks/_utils.cjs +0 -108
  122. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  123. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  124. package/.claude/hooks/app-edit-guard.cjs +0 -494
  125. package/.claude/hooks/auto-learn.cjs +0 -304
  126. package/.claude/hooks/bash-guard.cjs +0 -272
  127. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  128. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  129. package/.claude/hooks/context-watchdog.cjs +0 -230
  130. package/.claude/hooks/delegation-reminder.cjs +0 -465
  131. package/.claude/hooks/design-system-lint.cjs +0 -271
  132. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  133. package/.claude/hooks/prompt-guard.cjs +0 -354
  134. package/.claude/hooks/publish-template-guard.cjs +0 -147
  135. package/.claude/hooks/session-start.cjs +0 -35
  136. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  137. package/.claude/hooks/skill-injector.cjs +0 -140
  138. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  139. package/.claude/hooks/src-edit-guard.cjs +0 -240
  140. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  141. package/.claude/settings.json +0 -257
  142. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  143. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  144. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  145. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  146. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  147. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  148. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  149. package/.claude/skills/agent-structure/SKILL.md +0 -98
  150. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  151. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  152. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  153. package/.claude/skills/frontend-design/SKILL.md +0 -254
  154. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  155. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  156. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  157. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  158. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  159. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  160. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  161. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  162. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  163. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  164. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  165. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  166. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  167. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  168. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  169. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  170. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  171. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  172. package/.claude/skills/json-only-output/SKILL.md +0 -72
  173. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  174. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  175. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  176. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  177. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  178. package/.claude/skills/tool-builder/SKILL.md +0 -250
  179. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  180. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  181. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  182. package/.hailer-mcp-port +0 -1
  183. package/.mcp.json +0 -13
  184. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  185. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  186. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  187. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  188. package/.opencode/agent/agent-code-simplifier.md +0 -31
  189. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  190. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  191. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  192. package/.opencode/agent/agent-helga-workflow-config.md +0 -204
  193. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  194. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  195. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  196. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  197. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  198. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  199. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  200. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  201. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  202. package/.opencode/agent/agent-permissions-handler.md +0 -50
  203. package/.opencode/agent/agent-simple-writer.md +0 -45
  204. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  205. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  206. package/.opencode/agent/agent-ui-designer.md +0 -56
  207. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  208. package/.opencode/agent/agent-web-search.md +0 -42
  209. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  210. package/.opencode/agent/agent-zara-zapier.md +0 -53
  211. package/.opencode/commands/app-squad.md +0 -135
  212. package/.opencode/commands/audit-squad.md +0 -158
  213. package/.opencode/commands/autoplan.md +0 -563
  214. package/.opencode/commands/cleanup-squad.md +0 -98
  215. package/.opencode/commands/config-squad.md +0 -106
  216. package/.opencode/commands/crud-squad.md +0 -87
  217. package/.opencode/commands/data-squad.md +0 -97
  218. package/.opencode/commands/debug-squad.md +0 -303
  219. package/.opencode/commands/doc-squad.md +0 -65
  220. package/.opencode/commands/handoff.md +0 -137
  221. package/.opencode/commands/health.md +0 -49
  222. package/.opencode/commands/help-agents.md +0 -151
  223. package/.opencode/commands/help-commands.md +0 -32
  224. package/.opencode/commands/help-faq.md +0 -29
  225. package/.opencode/commands/help-plugins.md +0 -28
  226. package/.opencode/commands/help-skills.md +0 -7
  227. package/.opencode/commands/help-tools.md +0 -40
  228. package/.opencode/commands/help.md +0 -28
  229. package/.opencode/commands/hotfix-squad.md +0 -112
  230. package/.opencode/commands/integration-squad.md +0 -82
  231. package/.opencode/commands/janitor-squad.md +0 -167
  232. package/.opencode/commands/learn-auto.md +0 -120
  233. package/.opencode/commands/learn.md +0 -120
  234. package/.opencode/commands/mcp-list.md +0 -27
  235. package/.opencode/commands/onboard-squad.md +0 -140
  236. package/.opencode/commands/plan-workspace.md +0 -732
  237. package/.opencode/commands/prd.md +0 -131
  238. package/.opencode/commands/project-status.md +0 -82
  239. package/.opencode/commands/publish.md +0 -138
  240. package/.opencode/commands/recap.md +0 -69
  241. package/.opencode/commands/restore.md +0 -64
  242. package/.opencode/commands/review-squad.md +0 -152
  243. package/.opencode/commands/save.md +0 -24
  244. package/.opencode/commands/stats.md +0 -19
  245. package/.opencode/commands/swarm.md +0 -210
  246. package/.opencode/commands/tool-builder.md +0 -39
  247. package/.opencode/commands/ws-pull.md +0 -44
  248. package/.opencode/opencode.json +0 -21
  249. package/inbox/failures.log +0 -1
  250. package/inbox/usage.jsonl +0 -4
  251. package/scripts/postinstall.cjs +0 -64
  252. package/scripts/test-hal-tools.ts +0 -154
@@ -1,346 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * <hook-name>sync-marketplace-agents</hook-name>
4
- * <purpose>Watches installed_plugins.json for changes and updates CLAUDE.md with available marketplace agents</purpose>
5
- * <triggers>PostToolUse</triggers>
6
- *
7
- * Sync Marketplace Agents Hook
8
- */
9
-
10
- const fs = require('fs');
11
- const path = require('path');
12
- const os = require('os');
13
- const crypto = require('crypto');
14
-
15
- const ALLOW = JSON.stringify({ decision: 'allow' });
16
-
17
- const PLUGINS_DIR = path.join(os.homedir(), '.claude', 'plugins', 'marketplaces');
18
- const INSTALLED_PLUGINS = path.join(os.homedir(), '.claude', 'plugins', 'installed_plugins.json');
19
- const PROJECT_DIR = process.env.CLAUDE_PROJECT_DIR || process.cwd();
20
- const CLAUDE_MD = path.join(PROJECT_DIR, 'CLAUDE.md');
21
-
22
- // Store sync state in user's home, keyed by project path hash
23
- const SYNC_STATE_DIR = path.join(os.homedir(), '.claude', 'sync-state');
24
- const PROJECT_HASH = crypto.createHash('md5').update(PROJECT_DIR).digest('hex').slice(0, 12);
25
- const SYNC_STATE = path.join(SYNC_STATE_DIR, `${PROJECT_HASH}.state`);
26
-
27
- /**
28
- * Get hash of installed_plugins.json content
29
- */
30
- function getInstalledPluginsHash() {
31
- if (!fs.existsSync(INSTALLED_PLUGINS)) {
32
- return 'empty';
33
- }
34
- const content = fs.readFileSync(INSTALLED_PLUGINS, 'utf-8');
35
- return crypto.createHash('md5').update(content).digest('hex');
36
- }
37
-
38
- /**
39
- * Check if plugins have changed since last sync
40
- */
41
- function pluginsChanged() {
42
- const currentHash = getInstalledPluginsHash();
43
-
44
- if (!fs.existsSync(SYNC_STATE)) {
45
- return true; // First run
46
- }
47
-
48
- const lastHash = fs.readFileSync(SYNC_STATE, 'utf-8').trim();
49
- return currentHash !== lastHash;
50
- }
51
-
52
- /**
53
- * Save current sync state
54
- */
55
- function saveSyncState() {
56
- const currentHash = getInstalledPluginsHash();
57
- // Ensure sync state directory exists
58
- if (!fs.existsSync(SYNC_STATE_DIR)) {
59
- fs.mkdirSync(SYNC_STATE_DIR, { recursive: true });
60
- }
61
- fs.writeFileSync(SYNC_STATE, currentHash);
62
- }
63
-
64
- /**
65
- * Get installed plugins from installed_plugins.json
66
- * Returns Set of "plugin@marketplace" strings
67
- */
68
- function getInstalledPlugins() {
69
- const plugins = new Set();
70
-
71
- if (!fs.existsSync(INSTALLED_PLUGINS)) {
72
- return plugins;
73
- }
74
-
75
- try {
76
- const data = JSON.parse(fs.readFileSync(INSTALLED_PLUGINS, 'utf-8'));
77
- if (data.plugins) {
78
- for (const pluginKey of Object.keys(data.plugins)) {
79
- plugins.add(pluginKey);
80
- }
81
- }
82
- } catch (e) {
83
- // Ignore parse errors
84
- console.error(`[sync-marketplace-agents] Warning: ${e.message}`);
85
- }
86
-
87
- return plugins;
88
- }
89
-
90
- /**
91
- * Scan marketplace plugins for agents (all discovered plugins)
92
- * Supports three structures:
93
- * - Flat: {marketplace}/agents/ (when plugin name == marketplace name)
94
- * - Root-level: {marketplace}/{plugin}/agents/ (plugin dirs at marketplace root)
95
- * - Nested: {marketplace}/plugins/{plugin}/agents/
96
- */
97
- function scanMarketplaceAgents(enabledPlugins) {
98
- const agents = [];
99
-
100
- if (!fs.existsSync(PLUGINS_DIR)) {
101
- return agents;
102
- }
103
-
104
- const marketplaces = fs.readdirSync(PLUGINS_DIR);
105
-
106
- for (const marketplace of marketplaces) {
107
- const marketplacePath = path.join(PLUGINS_DIR, marketplace);
108
- if (!fs.statSync(marketplacePath).isDirectory()) continue;
109
-
110
- // Try flat structure first: {marketplace}/agents/
111
- const flatAgentsPath = path.join(marketplacePath, 'agents');
112
- if (fs.existsSync(flatAgentsPath)) {
113
- // For flat structure, plugin name equals marketplace name
114
- const pluginKey = `${marketplace}@${marketplace}`;
115
- if (enabledPlugins.has(pluginKey)) {
116
- const agentFiles = fs.readdirSync(flatAgentsPath).filter(f => f.endsWith('.md'));
117
-
118
- for (const agentFile of agentFiles) {
119
- const agentName = path.basename(agentFile, '.md');
120
- const fullPath = path.join(flatAgentsPath, agentFile);
121
- const content = fs.readFileSync(fullPath, 'utf-8');
122
- const frontmatter = parseFrontmatter(content);
123
-
124
- agents.push({
125
- marketplace,
126
- plugin: marketplace,
127
- name: agentName,
128
- fullName: `${marketplace}:${agentName}`,
129
- description: frontmatter.description || '',
130
- model: frontmatter.model || 'sonnet'
131
- });
132
- }
133
- }
134
- }
135
-
136
- // Try root-level plugins: {marketplace}/{plugin}/agents/
137
- // Each subdirectory with .claude-plugin is a plugin
138
- const marketplaceContents = fs.readdirSync(marketplacePath);
139
- for (const item of marketplaceContents) {
140
- if (item === '.claude-plugin' || item === '.git' || item === 'plugins') continue;
141
-
142
- const itemPath = path.join(marketplacePath, item);
143
- if (!fs.statSync(itemPath).isDirectory()) continue;
144
-
145
- const pluginJsonPath = path.join(itemPath, '.claude-plugin', 'plugin.json');
146
-
147
- // Check if this is a plugin (has .claude-plugin/plugin.json)
148
- if (fs.existsSync(pluginJsonPath)) {
149
- const pluginKey = `${item}@${marketplace}`;
150
- if (!enabledPlugins.has(pluginKey)) continue;
151
-
152
- const agentsPath = path.join(itemPath, 'agents');
153
- if (!fs.existsSync(agentsPath)) continue;
154
-
155
- const agentFiles = fs.readdirSync(agentsPath).filter(f => f.endsWith('.md'));
156
-
157
- for (const agentFile of agentFiles) {
158
- const agentName = path.basename(agentFile, '.md');
159
- const fullPath = path.join(agentsPath, agentFile);
160
- const content = fs.readFileSync(fullPath, 'utf-8');
161
- const frontmatter = parseFrontmatter(content);
162
-
163
- agents.push({
164
- marketplace,
165
- plugin: item,
166
- name: agentName,
167
- fullName: `${item}:${agentName}`,
168
- description: frontmatter.description || '',
169
- model: frontmatter.model || 'sonnet'
170
- });
171
- }
172
- }
173
- }
174
-
175
- // Try nested structure: {marketplace}/plugins/{plugin}/agents/
176
- const pluginsPath = path.join(marketplacePath, 'plugins');
177
- if (fs.existsSync(pluginsPath)) {
178
- const plugins = fs.readdirSync(pluginsPath);
179
-
180
- for (const plugin of plugins) {
181
- const pluginKey = `${plugin}@${marketplace}`;
182
- if (!enabledPlugins.has(pluginKey)) {
183
- continue;
184
- }
185
-
186
- const pluginPath = path.join(pluginsPath, plugin);
187
- if (!fs.statSync(pluginPath).isDirectory()) continue;
188
-
189
- const agentsPath = path.join(pluginPath, 'agents');
190
- if (!fs.existsSync(agentsPath)) continue;
191
-
192
- const agentFiles = fs.readdirSync(agentsPath).filter(f => f.endsWith('.md'));
193
-
194
- for (const agentFile of agentFiles) {
195
- const agentName = path.basename(agentFile, '.md');
196
- const fullPath = path.join(agentsPath, agentFile);
197
- const content = fs.readFileSync(fullPath, 'utf-8');
198
- const frontmatter = parseFrontmatter(content);
199
-
200
- agents.push({
201
- marketplace,
202
- plugin,
203
- name: agentName,
204
- fullName: `${plugin}:${agentName}`,
205
- description: frontmatter.description || '',
206
- model: frontmatter.model || 'sonnet'
207
- });
208
- }
209
- }
210
- }
211
- }
212
-
213
- return agents;
214
- }
215
-
216
- /**
217
- * Parse frontmatter from markdown
218
- */
219
- function parseFrontmatter(content) {
220
- const match = content.match(/^---\n([\s\S]*?)\n---/);
221
- if (!match) return {};
222
-
223
- const frontmatter = {};
224
- const lines = match[1].split('\n');
225
-
226
- for (const line of lines) {
227
- const colonIndex = line.indexOf(':');
228
- if (colonIndex <= 0 || line.startsWith(' ') || line.startsWith('\t')) continue; // skip indented/malformed lines
229
- if (colonIndex > 0) {
230
- const key = line.slice(0, colonIndex).trim();
231
- let value = line.slice(colonIndex + 1).trim();
232
- // Clean up description
233
- if (key === 'description') {
234
- value = value.replace(/\\n.*/g, '').slice(0, 100);
235
- }
236
- frontmatter[key] = value;
237
- }
238
- }
239
-
240
- return frontmatter;
241
- }
242
-
243
- /**
244
- * Generate marketplace agents table
245
- */
246
- function generateAgentTable(agents) {
247
- if (agents.length === 0) {
248
- return 'No marketplace agents installed.';
249
- }
250
-
251
- let table = '| Agent | Plugin | Model | Description |\n';
252
- table += '|-------|--------|-------|-------------|\n';
253
-
254
- for (const agent of agents) {
255
- const desc = agent.description.slice(0, 50) + (agent.description.length > 50 ? '...' : '');
256
- table += `| \`${agent.fullName}\` | ${agent.plugin} | ${agent.model} | ${desc} |\n`;
257
- }
258
-
259
- return table;
260
- }
261
-
262
- /**
263
- * Update CLAUDE.md with marketplace agents
264
- */
265
- function updateClaudeMd(agents) {
266
- if (!fs.existsSync(CLAUDE_MD)) {
267
- return { updated: false, reason: 'CLAUDE.md not found' };
268
- }
269
-
270
- let content = fs.readFileSync(CLAUDE_MD, 'utf-8');
271
-
272
- const agentTable = generateAgentTable(agents);
273
-
274
- // Find config-source section boundaries using indexOf
275
- const sectionStart = content.indexOf('<config-source>');
276
- const sectionEnd = content.indexOf('</config-source>');
277
-
278
- if (sectionStart !== -1 && sectionEnd !== -1) {
279
- // Find where table content starts (after section opening and any intro text)
280
- const tableStart = content.indexOf('| Agent |', sectionStart);
281
- const noAgentsMarker = content.indexOf('No marketplace agents installed.', sectionStart);
282
-
283
- let replaceStart, replaceEnd;
284
-
285
- if (tableStart !== -1 && tableStart < sectionEnd) {
286
- // Table exists, replace from table start to section end
287
- replaceStart = tableStart;
288
- replaceEnd = sectionEnd;
289
- } else if (noAgentsMarker !== -1 && noAgentsMarker < sectionEnd) {
290
- // "No agents" text exists, replace it
291
- replaceStart = noAgentsMarker;
292
- replaceEnd = noAgentsMarker + 'No marketplace agents installed.'.length;
293
- } else {
294
- // No table or marker, insert after section opening
295
- replaceStart = content.indexOf('\n', sectionStart) + 1;
296
- replaceEnd = replaceStart;
297
- }
298
-
299
- const before = content.substring(0, replaceStart);
300
- const after = content.substring(replaceEnd);
301
- content = before + agentTable + '\n\n' + after;
302
-
303
- fs.writeFileSync(CLAUDE_MD, content);
304
- return { updated: true, count: agents.length };
305
- }
306
-
307
- return { updated: false, reason: 'config-source section not found' };
308
- }
309
-
310
- /**
311
- * Main
312
- */
313
- function main() {
314
- // Skip if installed_plugins.json hasn't changed
315
- if (!pluginsChanged()) {
316
- console.log(ALLOW);
317
- process.exit(0);
318
- }
319
-
320
- try {
321
- // Get actually installed plugins from installed_plugins.json
322
- const installedPlugins = getInstalledPlugins();
323
-
324
- // Scan agents only from installed plugins
325
- const agents = scanMarketplaceAgents(installedPlugins);
326
- const result = updateClaudeMd(agents);
327
-
328
- // Save sync state
329
- saveSyncState();
330
-
331
- // Output info
332
- console.error(`[sync-agents] Detected plugin changes, found ${agents.length} marketplace agents`);
333
- if (result.updated) {
334
- console.error(`[sync-agents] Updated CLAUDE.md`);
335
- }
336
-
337
- console.log(ALLOW);
338
- process.exit(0);
339
- } catch (error) {
340
- console.error(`[sync-marketplace-agents] Warning: ${error.message}`);
341
- console.log(ALLOW);
342
- process.exit(0); // Don't block on errors
343
- }
344
- }
345
-
346
- main();
@@ -1,257 +0,0 @@
1
- {
2
- "env": {
3
- "ENABLE_LSP_TOOL": "1"
4
- },
5
- "permissions": {
6
- "deny": [
7
- "Read(./.env.local)",
8
- "Read(**/.env.local)",
9
- "Read(./.env)",
10
- "Edit(**/README.md)",
11
- "Write(**/README.md)"
12
- ]
13
- },
14
- "hooks": {
15
- "SessionStart": [
16
- {
17
- "matcher": "",
18
- "hooks": [
19
- {
20
- "type": "command",
21
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.cjs\"",
22
- "timeout": 5
23
- }
24
- ]
25
- }
26
- ],
27
- "UserPromptSubmit": [
28
- {
29
- "matcher": "",
30
- "hooks": [
31
- {
32
- "type": "command",
33
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/prompt-guard.cjs\"",
34
- "timeout": 5
35
- }
36
- ]
37
- }
38
- ],
39
- "PreToolUse": [
40
- {
41
- "matcher": "Task",
42
- "hooks": [
43
- {
44
- "type": "command",
45
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/builder-mode-manager.cjs\"",
46
- "timeout": 5
47
- }
48
- ]
49
- },
50
- {
51
- "matcher": "Bash",
52
- "hooks": [
53
- {
54
- "type": "command",
55
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/bash-guard.cjs\"",
56
- "timeout": 5
57
- }
58
- ]
59
- },
60
- {
61
- "matcher": "mcp__hailer__create_activity",
62
- "hooks": [
63
- {
64
- "type": "command",
65
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/bulk-activity-guard.cjs\"",
66
- "timeout": 5
67
- }
68
- ]
69
- },
70
- {
71
- "matcher": "mcp__hailer__publish_template",
72
- "hooks": [
73
- {
74
- "type": "command",
75
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/publish-template-guard.cjs\"",
76
- "timeout": 5
77
- }
78
- ]
79
- },
80
- {
81
- "matcher": "Write",
82
- "hooks": [
83
- {
84
- "type": "command",
85
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/app-edit-guard.cjs\"",
86
- "timeout": 5
87
- },
88
- {
89
- "type": "command",
90
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/src-edit-guard.cjs\"",
91
- "timeout": 5
92
- }
93
- ]
94
- },
95
- {
96
- "matcher": "Edit",
97
- "hooks": [
98
- {
99
- "type": "command",
100
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/app-edit-guard.cjs\"",
101
- "timeout": 5
102
- },
103
- {
104
- "type": "command",
105
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/src-edit-guard.cjs\"",
106
- "timeout": 5
107
- }
108
- ]
109
- },
110
- {
111
- "matcher": "Read",
112
- "hooks": [
113
- {
114
- "type": "command",
115
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/delegation-reminder.cjs\"",
116
- "timeout": 5
117
- }
118
- ]
119
- },
120
- {
121
- "matcher": "mcp__hailer__",
122
- "hooks": [
123
- {
124
- "type": "command",
125
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/delegation-reminder.cjs\"",
126
- "timeout": 5
127
- }
128
- ]
129
- }
130
- ],
131
- "PostToolUse": [
132
- {
133
- "matcher": "mcp__hailer__scaffold_hailer_app",
134
- "hooks": [
135
- {
136
- "type": "command",
137
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/post-scaffold-hook.cjs\"",
138
- "timeout": 5
139
- }
140
- ]
141
- },
142
- {
143
- "matcher": "Task",
144
- "hooks": [
145
- {
146
- "type": "command",
147
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/builder-mode-manager.cjs\"",
148
- "timeout": 5
149
- },
150
- {
151
- "type": "command",
152
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/agent-failure-detector.cjs\"",
153
- "timeout": 5,
154
- "async": true
155
- },
156
- {
157
- "type": "command",
158
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/auto-learn.cjs\"",
159
- "timeout": 5,
160
- "async": true
161
- },
162
- {
163
- "type": "command",
164
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/agent-usage-logger.cjs\"",
165
- "timeout": 5,
166
- "async": true
167
- },
168
- {
169
- "type": "command",
170
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/context-watchdog.cjs\"",
171
- "timeout": 5
172
- },
173
- {
174
- "type": "command",
175
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/shared-memory-writer.cjs\"",
176
- "timeout": 5,
177
- "async": true
178
- },
179
- {
180
- "type": "command",
181
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/sync-marketplace-agents.cjs\"",
182
- "timeout": 5,
183
- "async": true
184
- }
185
- ]
186
- },
187
- {
188
- "matcher": "Write",
189
- "hooks": [
190
- {
191
- "type": "command",
192
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/design-system-lint.cjs\"",
193
- "timeout": 5
194
- }
195
- ]
196
- },
197
- {
198
- "matcher": "Edit",
199
- "hooks": [
200
- {
201
- "type": "command",
202
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/design-system-lint.cjs\"",
203
- "timeout": 5
204
- }
205
- ]
206
- },
207
- {
208
- "matcher": "Skill",
209
- "hooks": [
210
- {
211
- "type": "command",
212
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/skill-usage-logger.cjs\"",
213
- "timeout": 5,
214
- "async": true
215
- }
216
- ]
217
- }
218
- ],
219
- "PreCompact": [
220
- {
221
- "matcher": "auto",
222
- "hooks": [
223
- {
224
- "type": "command",
225
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/context-watchdog.cjs\"",
226
- "timeout": 5
227
- }
228
- ]
229
- }
230
- ],
231
- "SubagentStart": [
232
- {
233
- "matcher": "",
234
- "hooks": [
235
- {
236
- "type": "command",
237
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/skill-injector.cjs\"",
238
- "timeout": 10
239
- }
240
- ]
241
- }
242
- ],
243
- "Stop": [
244
- {
245
- "matcher": "",
246
- "hooks": [
247
- {
248
- "type": "command",
249
- "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/context-watchdog.cjs\"",
250
- "timeout": 5
251
- }
252
- ]
253
- }
254
- ]
255
- },
256
- "enabledPlugins": {}
257
- }