@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.
- package/dist/app.js +18 -5
- package/dist/bot/bot-config.d.ts +12 -1
- package/dist/bot/bot-config.js +98 -14
- package/dist/bot/bot-manager.d.ts +13 -3
- package/dist/bot/bot-manager.js +80 -25
- package/dist/bot/bot.d.ts +46 -0
- package/dist/bot/bot.js +542 -166
- package/dist/bot/services/message-classifier.js +17 -0
- package/dist/bot/services/permission-guard.d.ts +52 -0
- package/dist/bot/services/permission-guard.js +149 -0
- package/dist/bot/services/types.d.ts +5 -0
- package/dist/bot/services/typing-indicator.d.ts +6 -1
- package/dist/bot/services/typing-indicator.js +19 -3
- package/dist/config.d.ts +6 -1
- package/dist/config.js +43 -0
- package/dist/core.js +3 -6
- package/dist/mcp/UserContextCache.d.ts +5 -0
- package/dist/mcp/UserContextCache.js +51 -19
- package/dist/mcp/hailer-clients.d.ts +19 -1
- package/dist/mcp/hailer-clients.js +157 -20
- package/dist/mcp/session-store.d.ts +68 -0
- package/dist/mcp/session-store.js +169 -0
- package/dist/mcp/signal-handler.js +12 -12
- package/dist/mcp/tool-registry.d.ts +17 -4
- package/dist/mcp/tool-registry.js +37 -7
- package/dist/mcp/tools/activity.js +99 -7
- package/dist/mcp/tools/app-scaffold.js +304 -336
- package/dist/mcp/tools/company.d.ts +9 -0
- package/dist/mcp/tools/company.js +88 -0
- package/dist/mcp/tools/discussion.js +68 -0
- package/dist/mcp/tools/workflow-permissions.d.ts +15 -0
- package/dist/mcp/tools/workflow-permissions.js +204 -0
- package/dist/mcp/tools/workflow.js +57 -18
- package/dist/mcp/utils/index.d.ts +2 -0
- package/dist/mcp/utils/index.js +12 -1
- package/dist/mcp/utils/role-utils.d.ts +74 -0
- package/dist/mcp/utils/role-utils.js +151 -0
- package/dist/mcp/utils/types.d.ts +43 -1
- package/dist/mcp/utils/types.js +14 -0
- package/dist/mcp/webhook-handler.d.ts +6 -0
- package/dist/mcp/webhook-handler.js +11 -0
- package/dist/mcp-server.d.ts +23 -2
- package/dist/mcp-server.js +639 -111
- package/dist/plugins/vipunen/client.d.ts +150 -0
- package/dist/plugins/vipunen/client.js +535 -0
- package/dist/plugins/vipunen/config/schema-config.json +19 -0
- package/dist/plugins/vipunen/config/schema-doc.json +22 -0
- package/dist/plugins/vipunen/index.d.ts +41 -0
- package/dist/plugins/vipunen/index.js +88 -0
- package/dist/plugins/vipunen/tools.d.ts +26 -0
- package/dist/plugins/vipunen/tools.js +501 -0
- package/package.json +2 -1
- package/.claude/.context-watchdog.json +0 -1
- package/.claude/.session-checked +0 -1
- package/.claude/CLAUDE.md +0 -370
- package/.claude/agents/agent-ada-skill-builder.md +0 -94
- package/.claude/agents/agent-alejandro-function-fields.md +0 -342
- package/.claude/agents/agent-bjorn-config-audit.md +0 -103
- package/.claude/agents/agent-builder-agent-creator.md +0 -130
- package/.claude/agents/agent-code-simplifier.md +0 -53
- package/.claude/agents/agent-dmitri-activity-crud.md +0 -159
- package/.claude/agents/agent-giuseppe-app-builder.md +0 -247
- package/.claude/agents/agent-gunther-mcp-tools.md +0 -39
- package/.claude/agents/agent-helga-workflow-config.md +0 -204
- package/.claude/agents/agent-igor-activity-mover-automation.md +0 -125
- package/.claude/agents/agent-ingrid-doc-templates.md +0 -261
- package/.claude/agents/agent-ivan-monolith.md +0 -154
- package/.claude/agents/agent-kenji-data-reader.md +0 -86
- package/.claude/agents/agent-lars-code-inspector.md +0 -102
- package/.claude/agents/agent-marco-mockup-builder.md +0 -110
- package/.claude/agents/agent-marcus-api-documenter.md +0 -323
- package/.claude/agents/agent-marketplace-publisher.md +0 -280
- package/.claude/agents/agent-marketplace-reviewer.md +0 -309
- package/.claude/agents/agent-permissions-handler.md +0 -208
- package/.claude/agents/agent-simple-writer.md +0 -48
- package/.claude/agents/agent-svetlana-code-review.md +0 -171
- package/.claude/agents/agent-tanya-test-runner.md +0 -333
- package/.claude/agents/agent-ui-designer.md +0 -100
- package/.claude/agents/agent-viktor-sql-insights.md +0 -212
- package/.claude/agents/agent-web-search.md +0 -55
- package/.claude/agents/agent-yevgeni-discussions.md +0 -45
- package/.claude/agents/agent-zara-zapier.md +0 -159
- package/.claude/commands/app-squad.md +0 -135
- package/.claude/commands/audit-squad.md +0 -158
- package/.claude/commands/autoplan.md +0 -563
- package/.claude/commands/cleanup-squad.md +0 -98
- package/.claude/commands/config-squad.md +0 -106
- package/.claude/commands/crud-squad.md +0 -87
- package/.claude/commands/data-squad.md +0 -97
- package/.claude/commands/debug-squad.md +0 -303
- package/.claude/commands/doc-squad.md +0 -65
- package/.claude/commands/handoff.md +0 -137
- package/.claude/commands/health.md +0 -49
- package/.claude/commands/help.md +0 -29
- package/.claude/commands/help:agents.md +0 -151
- package/.claude/commands/help:commands.md +0 -78
- package/.claude/commands/help:faq.md +0 -79
- package/.claude/commands/help:plugins.md +0 -50
- package/.claude/commands/help:skills.md +0 -93
- package/.claude/commands/help:tools.md +0 -75
- package/.claude/commands/hotfix-squad.md +0 -112
- package/.claude/commands/integration-squad.md +0 -82
- package/.claude/commands/janitor-squad.md +0 -167
- package/.claude/commands/learn-auto.md +0 -120
- package/.claude/commands/learn.md +0 -120
- package/.claude/commands/mcp-list.md +0 -27
- package/.claude/commands/onboard-squad.md +0 -140
- package/.claude/commands/plan-workspace.md +0 -732
- package/.claude/commands/prd.md +0 -130
- package/.claude/commands/project-status.md +0 -82
- package/.claude/commands/publish.md +0 -138
- package/.claude/commands/recap.md +0 -69
- package/.claude/commands/restore.md +0 -64
- package/.claude/commands/review-squad.md +0 -152
- package/.claude/commands/save.md +0 -24
- package/.claude/commands/stats.md +0 -19
- package/.claude/commands/swarm.md +0 -210
- package/.claude/commands/tool-builder.md +0 -39
- package/.claude/commands/ws-pull.md +0 -44
- package/.claude/hooks/_shared-memory.cjs +0 -305
- package/.claude/hooks/_utils.cjs +0 -108
- package/.claude/hooks/agent-failure-detector.cjs +0 -383
- package/.claude/hooks/agent-usage-logger.cjs +0 -204
- package/.claude/hooks/app-edit-guard.cjs +0 -494
- package/.claude/hooks/auto-learn.cjs +0 -304
- package/.claude/hooks/bash-guard.cjs +0 -272
- package/.claude/hooks/builder-mode-manager.cjs +0 -354
- package/.claude/hooks/bulk-activity-guard.cjs +0 -271
- package/.claude/hooks/context-watchdog.cjs +0 -230
- package/.claude/hooks/delegation-reminder.cjs +0 -465
- package/.claude/hooks/design-system-lint.cjs +0 -271
- package/.claude/hooks/post-scaffold-hook.cjs +0 -181
- package/.claude/hooks/prompt-guard.cjs +0 -354
- package/.claude/hooks/publish-template-guard.cjs +0 -147
- package/.claude/hooks/session-start.cjs +0 -35
- package/.claude/hooks/shared-memory-writer.cjs +0 -147
- package/.claude/hooks/skill-injector.cjs +0 -140
- package/.claude/hooks/skill-usage-logger.cjs +0 -258
- package/.claude/hooks/src-edit-guard.cjs +0 -240
- package/.claude/hooks/sync-marketplace-agents.cjs +0 -346
- package/.claude/settings.json +0 -257
- package/.claude/skills/SDK-activity-patterns/SKILL.md +0 -428
- package/.claude/skills/SDK-document-templates/SKILL.md +0 -1033
- package/.claude/skills/SDK-function-fields/SKILL.md +0 -542
- package/.claude/skills/SDK-generate-skill/SKILL.md +0 -92
- package/.claude/skills/SDK-init-skill/SKILL.md +0 -127
- package/.claude/skills/SDK-insight-queries/SKILL.md +0 -787
- package/.claude/skills/SDK-ws-config-skill/SKILL.md +0 -1139
- package/.claude/skills/agent-structure/SKILL.md +0 -98
- package/.claude/skills/api-documentation-patterns/SKILL.md +0 -474
- package/.claude/skills/chrome-mcp-reference/SKILL.md +0 -370
- package/.claude/skills/delegation-routing/SKILL.md +0 -202
- package/.claude/skills/frontend-design/SKILL.md +0 -254
- package/.claude/skills/hailer-activity-mover/SKILL.md +0 -213
- package/.claude/skills/hailer-api-client/SKILL.md +0 -518
- package/.claude/skills/hailer-app-builder/SKILL.md +0 -1434
- package/.claude/skills/hailer-apps-pictures/SKILL.md +0 -269
- package/.claude/skills/hailer-design-system/SKILL.md +0 -235
- package/.claude/skills/hailer-monolith-automations/SKILL.md +0 -686
- package/.claude/skills/hailer-permissions-system/SKILL.md +0 -121
- package/.claude/skills/hailer-project-protocol/SKILL.md +0 -488
- package/.claude/skills/hailer-rest-api/SKILL.md +0 -61
- package/.claude/skills/hailer-rest-api/hailer-activities.md +0 -184
- package/.claude/skills/hailer-rest-api/hailer-admin.md +0 -473
- package/.claude/skills/hailer-rest-api/hailer-calendar.md +0 -256
- package/.claude/skills/hailer-rest-api/hailer-feed.md +0 -249
- package/.claude/skills/hailer-rest-api/hailer-insights.md +0 -195
- package/.claude/skills/hailer-rest-api/hailer-messaging.md +0 -276
- package/.claude/skills/hailer-rest-api/hailer-workflows.md +0 -283
- package/.claude/skills/insight-join-patterns/SKILL.md +0 -174
- package/.claude/skills/integration-patterns/SKILL.md +0 -421
- package/.claude/skills/json-only-output/SKILL.md +0 -72
- package/.claude/skills/lsp-setup/SKILL.md +0 -160
- package/.claude/skills/mcp-direct-tools/SKILL.md +0 -153
- package/.claude/skills/optional-parameters/SKILL.md +0 -72
- package/.claude/skills/publish-hailer-app/SKILL.md +0 -244
- package/.claude/skills/testing-patterns/SKILL.md +0 -630
- package/.claude/skills/tool-builder/SKILL.md +0 -250
- package/.claude/skills/tool-parameter-usage/SKILL.md +0 -126
- package/.claude/skills/tool-response-verification/SKILL.md +0 -92
- package/.claude/skills/zapier-hailer-patterns/SKILL.md +0 -581
- package/.hailer-mcp-port +0 -1
- package/.mcp.json +0 -13
- package/.opencode/agent/agent-ada-skill-builder.md +0 -35
- package/.opencode/agent/agent-alejandro-function-fields.md +0 -39
- package/.opencode/agent/agent-bjorn-config-audit.md +0 -36
- package/.opencode/agent/agent-builder-agent-creator.md +0 -39
- package/.opencode/agent/agent-code-simplifier.md +0 -31
- package/.opencode/agent/agent-dmitri-activity-crud.md +0 -40
- package/.opencode/agent/agent-giuseppe-app-builder.md +0 -37
- package/.opencode/agent/agent-gunther-mcp-tools.md +0 -39
- package/.opencode/agent/agent-helga-workflow-config.md +0 -204
- package/.opencode/agent/agent-igor-activity-mover-automation.md +0 -46
- package/.opencode/agent/agent-ingrid-doc-templates.md +0 -39
- package/.opencode/agent/agent-ivan-monolith.md +0 -46
- package/.opencode/agent/agent-kenji-data-reader.md +0 -53
- package/.opencode/agent/agent-lars-code-inspector.md +0 -28
- package/.opencode/agent/agent-marco-mockup-builder.md +0 -42
- package/.opencode/agent/agent-marcus-api-documenter.md +0 -53
- package/.opencode/agent/agent-marketplace-publisher.md +0 -44
- package/.opencode/agent/agent-marketplace-reviewer.md +0 -42
- package/.opencode/agent/agent-permissions-handler.md +0 -50
- package/.opencode/agent/agent-simple-writer.md +0 -45
- package/.opencode/agent/agent-svetlana-code-review.md +0 -39
- package/.opencode/agent/agent-tanya-test-runner.md +0 -57
- package/.opencode/agent/agent-ui-designer.md +0 -56
- package/.opencode/agent/agent-viktor-sql-insights.md +0 -34
- package/.opencode/agent/agent-web-search.md +0 -42
- package/.opencode/agent/agent-yevgeni-discussions.md +0 -37
- package/.opencode/agent/agent-zara-zapier.md +0 -53
- package/.opencode/commands/app-squad.md +0 -135
- package/.opencode/commands/audit-squad.md +0 -158
- package/.opencode/commands/autoplan.md +0 -563
- package/.opencode/commands/cleanup-squad.md +0 -98
- package/.opencode/commands/config-squad.md +0 -106
- package/.opencode/commands/crud-squad.md +0 -87
- package/.opencode/commands/data-squad.md +0 -97
- package/.opencode/commands/debug-squad.md +0 -303
- package/.opencode/commands/doc-squad.md +0 -65
- package/.opencode/commands/handoff.md +0 -137
- package/.opencode/commands/health.md +0 -49
- package/.opencode/commands/help-agents.md +0 -151
- package/.opencode/commands/help-commands.md +0 -32
- package/.opencode/commands/help-faq.md +0 -29
- package/.opencode/commands/help-plugins.md +0 -28
- package/.opencode/commands/help-skills.md +0 -7
- package/.opencode/commands/help-tools.md +0 -40
- package/.opencode/commands/help.md +0 -28
- package/.opencode/commands/hotfix-squad.md +0 -112
- package/.opencode/commands/integration-squad.md +0 -82
- package/.opencode/commands/janitor-squad.md +0 -167
- package/.opencode/commands/learn-auto.md +0 -120
- package/.opencode/commands/learn.md +0 -120
- package/.opencode/commands/mcp-list.md +0 -27
- package/.opencode/commands/onboard-squad.md +0 -140
- package/.opencode/commands/plan-workspace.md +0 -732
- package/.opencode/commands/prd.md +0 -131
- package/.opencode/commands/project-status.md +0 -82
- package/.opencode/commands/publish.md +0 -138
- package/.opencode/commands/recap.md +0 -69
- package/.opencode/commands/restore.md +0 -64
- package/.opencode/commands/review-squad.md +0 -152
- package/.opencode/commands/save.md +0 -24
- package/.opencode/commands/stats.md +0 -19
- package/.opencode/commands/swarm.md +0 -210
- package/.opencode/commands/tool-builder.md +0 -39
- package/.opencode/commands/ws-pull.md +0 -44
- package/.opencode/opencode.json +0 -21
- package/inbox/failures.log +0 -1
- package/inbox/usage.jsonl +0 -4
- package/scripts/postinstall.cjs +0 -64
- 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();
|
package/.claude/settings.json
DELETED
|
@@ -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
|
-
}
|