@hailer/mcp 1.1.12 → 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 (271) hide show
  1. package/CHANGELOG.md +0 -7
  2. package/{.claude → dist}/CLAUDE.md +2 -2
  3. package/dist/app.js +18 -5
  4. package/dist/bot/bot-config.d.ts +10 -1
  5. package/dist/bot/bot-config.js +64 -3
  6. package/dist/bot/bot-manager.d.ts +2 -0
  7. package/dist/bot/bot-manager.js +9 -2
  8. package/dist/bot/bot.d.ts +33 -0
  9. package/dist/bot/bot.js +461 -160
  10. package/dist/bot/services/message-classifier.js +17 -0
  11. package/dist/bot/services/permission-guard.d.ts +52 -0
  12. package/dist/bot/services/permission-guard.js +149 -0
  13. package/dist/bot/services/types.d.ts +5 -0
  14. package/dist/bot/services/typing-indicator.d.ts +6 -1
  15. package/dist/bot/services/typing-indicator.js +19 -3
  16. package/dist/cli.js +0 -0
  17. package/dist/config.d.ts +6 -1
  18. package/dist/config.js +43 -0
  19. package/dist/core.js +3 -6
  20. package/dist/lib/discussion-lock.d.ts +42 -0
  21. package/dist/lib/discussion-lock.js +110 -0
  22. package/dist/mcp/UserContextCache.d.ts +5 -0
  23. package/dist/mcp/UserContextCache.js +51 -19
  24. package/dist/mcp/hailer-clients.d.ts +19 -1
  25. package/dist/mcp/hailer-clients.js +158 -24
  26. package/dist/mcp/session-store.d.ts +68 -0
  27. package/dist/mcp/session-store.js +169 -0
  28. package/dist/mcp/signal-handler.js +2 -0
  29. package/dist/mcp/tool-registry.d.ts +17 -4
  30. package/dist/mcp/tool-registry.js +37 -7
  31. package/dist/mcp/tools/activity.js +99 -7
  32. package/dist/mcp/tools/app-scaffold.js +304 -336
  33. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  34. package/dist/mcp/tools/bot-config/constants.js +94 -0
  35. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  36. package/dist/mcp/tools/bot-config/core.js +2456 -0
  37. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  38. package/dist/mcp/tools/bot-config/index.js +59 -0
  39. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  40. package/dist/mcp/tools/bot-config/tools.js +15 -0
  41. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  42. package/dist/mcp/tools/bot-config/types.js +6 -0
  43. package/dist/mcp/tools/bug-fixer-tools.d.ts +45 -0
  44. package/dist/mcp/tools/bug-fixer-tools.js +1096 -0
  45. package/dist/mcp/tools/company.d.ts +9 -0
  46. package/dist/mcp/tools/company.js +88 -0
  47. package/dist/mcp/tools/discussion.js +68 -0
  48. package/dist/mcp/tools/document.d.ts +11 -0
  49. package/dist/mcp/tools/document.js +741 -0
  50. package/dist/mcp/tools/investigate.d.ts +9 -0
  51. package/dist/mcp/tools/investigate.js +254 -0
  52. package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
  53. package/dist/mcp/tools/workflow-permissions.js +204 -0
  54. package/dist/mcp/tools/workflow.js +57 -18
  55. package/dist/mcp/utils/index.d.ts +2 -0
  56. package/dist/mcp/utils/index.js +12 -1
  57. package/dist/mcp/utils/role-utils.d.ts +74 -0
  58. package/dist/mcp/utils/role-utils.js +151 -0
  59. package/dist/mcp/utils/types.d.ts +43 -1
  60. package/dist/mcp/utils/types.js +14 -0
  61. package/dist/mcp/webhook-handler.d.ts +4 -0
  62. package/dist/mcp/webhook-handler.js +8 -0
  63. package/dist/mcp-server.d.ts +23 -2
  64. package/dist/mcp-server.js +639 -127
  65. package/dist/plugins/vipunen/client.d.ts +150 -0
  66. package/dist/plugins/vipunen/client.js +535 -0
  67. package/dist/plugins/vipunen/config/schema-config.json +19 -0
  68. package/dist/plugins/vipunen/config/schema-doc.json +22 -0
  69. package/dist/plugins/vipunen/index.d.ts +41 -0
  70. package/dist/plugins/vipunen/index.js +88 -0
  71. package/dist/plugins/vipunen/tools.d.ts +26 -0
  72. package/dist/plugins/vipunen/tools.js +501 -0
  73. package/dist/stdio-server.d.ts +14 -0
  74. package/dist/stdio-server.js +101 -0
  75. package/package.json +2 -1
  76. package/.claude/agents/agent-ada-skill-builder.md +0 -94
  77. package/.claude/agents/agent-alejandro-function-fields.md +0 -342
  78. package/.claude/agents/agent-bjorn-config-audit.md +0 -103
  79. package/.claude/agents/agent-builder-agent-creator.md +0 -130
  80. package/.claude/agents/agent-code-simplifier.md +0 -53
  81. package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
  82. package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
  83. package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
  84. package/.claude/agents/agent-helga-workflow-config.md +0 -204
  85. package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
  86. package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
  87. package/.claude/agents/agent-ivan-monolith.md +0 -154
  88. package/.claude/agents/agent-kenji-data-reader.md +0 -86
  89. package/.claude/agents/agent-lars-code-inspector.md +0 -102
  90. package/.claude/agents/agent-marco-mockup-builder.md +0 -110
  91. package/.claude/agents/agent-marcus-api-documenter.md +0 -323
  92. package/.claude/agents/agent-marketplace-publisher.md +0 -280
  93. package/.claude/agents/agent-marketplace-reviewer.md +0 -309
  94. package/.claude/agents/agent-permissions-handler.md +0 -208
  95. package/.claude/agents/agent-simple-writer.md +0 -48
  96. package/.claude/agents/agent-svetlana-code-review.md +0 -171
  97. package/.claude/agents/agent-tanya-test-runner.md +0 -333
  98. package/.claude/agents/agent-ui-designer.md +0 -100
  99. package/.claude/agents/agent-viktor-sql-insights.md +0 -212
  100. package/.claude/agents/agent-web-search.md +0 -55
  101. package/.claude/agents/agent-yevgeni-discussions.md +0 -45
  102. package/.claude/agents/agent-zara-zapier.md +0 -159
  103. package/.claude/commands/app-squad.md +0 -135
  104. package/.claude/commands/audit-squad.md +0 -158
  105. package/.claude/commands/autoplan.md +0 -563
  106. package/.claude/commands/cleanup-squad.md +0 -98
  107. package/.claude/commands/config-squad.md +0 -106
  108. package/.claude/commands/crud-squad.md +0 -87
  109. package/.claude/commands/data-squad.md +0 -97
  110. package/.claude/commands/debug-squad.md +0 -303
  111. package/.claude/commands/doc-squad.md +0 -65
  112. package/.claude/commands/handoff.md +0 -137
  113. package/.claude/commands/health.md +0 -49
  114. package/.claude/commands/help.md +0 -29
  115. package/.claude/commands/help:agents.md +0 -151
  116. package/.claude/commands/help:commands.md +0 -78
  117. package/.claude/commands/help:faq.md +0 -79
  118. package/.claude/commands/help:plugins.md +0 -50
  119. package/.claude/commands/help:skills.md +0 -93
  120. package/.claude/commands/help:tools.md +0 -75
  121. package/.claude/commands/hotfix-squad.md +0 -112
  122. package/.claude/commands/integration-squad.md +0 -82
  123. package/.claude/commands/janitor-squad.md +0 -167
  124. package/.claude/commands/learn-auto.md +0 -120
  125. package/.claude/commands/learn.md +0 -120
  126. package/.claude/commands/mcp-list.md +0 -27
  127. package/.claude/commands/onboard-squad.md +0 -140
  128. package/.claude/commands/plan-workspace.md +0 -732
  129. package/.claude/commands/prd.md +0 -130
  130. package/.claude/commands/project-status.md +0 -82
  131. package/.claude/commands/publish.md +0 -138
  132. package/.claude/commands/recap.md +0 -69
  133. package/.claude/commands/restore.md +0 -64
  134. package/.claude/commands/review-squad.md +0 -152
  135. package/.claude/commands/save.md +0 -24
  136. package/.claude/commands/stats.md +0 -19
  137. package/.claude/commands/swarm.md +0 -210
  138. package/.claude/commands/tool-builder.md +0 -39
  139. package/.claude/commands/ws-pull.md +0 -44
  140. package/.claude/hooks/_shared-memory.cjs +0 -305
  141. package/.claude/hooks/_utils.cjs +0 -108
  142. package/.claude/hooks/agent-failure-detector.cjs +0 -383
  143. package/.claude/hooks/agent-usage-logger.cjs +0 -204
  144. package/.claude/hooks/app-edit-guard.cjs +0 -494
  145. package/.claude/hooks/auto-learn.cjs +0 -304
  146. package/.claude/hooks/bash-guard.cjs +0 -272
  147. package/.claude/hooks/builder-mode-manager.cjs +0 -354
  148. package/.claude/hooks/bulk-activity-guard.cjs +0 -271
  149. package/.claude/hooks/context-watchdog.cjs +0 -230
  150. package/.claude/hooks/delegation-reminder.cjs +0 -465
  151. package/.claude/hooks/design-system-lint.cjs +0 -271
  152. package/.claude/hooks/post-scaffold-hook.cjs +0 -181
  153. package/.claude/hooks/prompt-guard.cjs +0 -354
  154. package/.claude/hooks/publish-template-guard.cjs +0 -147
  155. package/.claude/hooks/session-start.cjs +0 -35
  156. package/.claude/hooks/shared-memory-writer.cjs +0 -147
  157. package/.claude/hooks/skill-injector.cjs +0 -140
  158. package/.claude/hooks/skill-usage-logger.cjs +0 -258
  159. package/.claude/hooks/src-edit-guard.cjs +0 -240
  160. package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
  161. package/.claude/settings.json +0 -257
  162. package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
  163. package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
  164. package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
  165. package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
  166. package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
  167. package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
  168. package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
  169. package/.claude/skills/agent-structure/SKILL.md +0 -98
  170. package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
  171. package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
  172. package/.claude/skills/delegation-routing/SKILL.md +0 -202
  173. package/.claude/skills/frontend-design/SKILL.md +0 -254
  174. package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
  175. package/.claude/skills/hailer-api-client/SKILL.md +0 -518
  176. package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
  177. package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
  178. package/.claude/skills/hailer-design-system/SKILL.md +0 -235
  179. package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
  180. package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
  181. package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
  182. package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
  183. package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
  184. package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
  185. package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
  186. package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
  187. package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
  188. package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
  189. package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
  190. package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
  191. package/.claude/skills/integration-patterns/SKILL.md +0 -421
  192. package/.claude/skills/json-only-output/SKILL.md +0 -72
  193. package/.claude/skills/lsp-setup/SKILL.md +0 -160
  194. package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
  195. package/.claude/skills/optional-parameters/SKILL.md +0 -72
  196. package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
  197. package/.claude/skills/testing-patterns/SKILL.md +0 -630
  198. package/.claude/skills/tool-builder/SKILL.md +0 -250
  199. package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
  200. package/.claude/skills/tool-response-verification/SKILL.md +0 -92
  201. package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
  202. package/.mcp.json +0 -13
  203. package/.opencode/agent/agent-ada-skill-builder.md +0 -35
  204. package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
  205. package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
  206. package/.opencode/agent/agent-builder-agent-creator.md +0 -39
  207. package/.opencode/agent/agent-code-simplifier.md +0 -31
  208. package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
  209. package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
  210. package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
  211. package/.opencode/agent/agent-helga-workflow-config.md +0 -203
  212. package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
  213. package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
  214. package/.opencode/agent/agent-ivan-monolith.md +0 -46
  215. package/.opencode/agent/agent-kenji-data-reader.md +0 -53
  216. package/.opencode/agent/agent-lars-code-inspector.md +0 -28
  217. package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
  218. package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
  219. package/.opencode/agent/agent-marketplace-publisher.md +0 -44
  220. package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
  221. package/.opencode/agent/agent-permissions-handler.md +0 -50
  222. package/.opencode/agent/agent-simple-writer.md +0 -45
  223. package/.opencode/agent/agent-svetlana-code-review.md +0 -39
  224. package/.opencode/agent/agent-tanya-test-runner.md +0 -57
  225. package/.opencode/agent/agent-ui-designer.md +0 -56
  226. package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
  227. package/.opencode/agent/agent-web-search.md +0 -42
  228. package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
  229. package/.opencode/agent/agent-zara-zapier.md +0 -53
  230. package/.opencode/commands/app-squad.md +0 -135
  231. package/.opencode/commands/audit-squad.md +0 -158
  232. package/.opencode/commands/autoplan.md +0 -563
  233. package/.opencode/commands/cleanup-squad.md +0 -98
  234. package/.opencode/commands/config-squad.md +0 -106
  235. package/.opencode/commands/crud-squad.md +0 -87
  236. package/.opencode/commands/data-squad.md +0 -97
  237. package/.opencode/commands/debug-squad.md +0 -303
  238. package/.opencode/commands/doc-squad.md +0 -65
  239. package/.opencode/commands/handoff.md +0 -137
  240. package/.opencode/commands/health.md +0 -49
  241. package/.opencode/commands/help-agents.md +0 -151
  242. package/.opencode/commands/help-commands.md +0 -32
  243. package/.opencode/commands/help-faq.md +0 -29
  244. package/.opencode/commands/help-plugins.md +0 -28
  245. package/.opencode/commands/help-skills.md +0 -7
  246. package/.opencode/commands/help-tools.md +0 -40
  247. package/.opencode/commands/help.md +0 -28
  248. package/.opencode/commands/hotfix-squad.md +0 -112
  249. package/.opencode/commands/integration-squad.md +0 -82
  250. package/.opencode/commands/janitor-squad.md +0 -167
  251. package/.opencode/commands/learn-auto.md +0 -120
  252. package/.opencode/commands/learn.md +0 -120
  253. package/.opencode/commands/mcp-list.md +0 -27
  254. package/.opencode/commands/onboard-squad.md +0 -140
  255. package/.opencode/commands/plan-workspace.md +0 -732
  256. package/.opencode/commands/prd.md +0 -131
  257. package/.opencode/commands/project-status.md +0 -82
  258. package/.opencode/commands/publish.md +0 -138
  259. package/.opencode/commands/recap.md +0 -69
  260. package/.opencode/commands/restore.md +0 -64
  261. package/.opencode/commands/review-squad.md +0 -152
  262. package/.opencode/commands/save.md +0 -24
  263. package/.opencode/commands/stats.md +0 -19
  264. package/.opencode/commands/swarm.md +0 -210
  265. package/.opencode/commands/tool-builder.md +0 -39
  266. package/.opencode/commands/ws-pull.md +0 -44
  267. package/.opencode/opencode.json +0 -28
  268. package/SESSION-HANDOFF.md +0 -68
  269. package/inbox/2026-03-04-bot-config-patterns.md +0 -24
  270. package/scripts/postinstall.cjs +0 -64
  271. 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
- }