@joelbonito/mcp-server 5.2.0 → 5.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/resources.js +11 -9
- package/dist/init.d.ts +12 -0
- package/dist/init.js +146 -0
- package/dist/install.d.ts +12 -0
- package/dist/install.js +186 -0
- package/dist/registry.d.ts +5 -0
- package/dist/registry.js +162 -48
- package/package.json +7 -6
package/dist/core/resources.js
CHANGED
|
@@ -89,18 +89,20 @@ ${agentList}
|
|
|
89
89
|
|
|
90
90
|
When the user says "implement Epic X" or "implement Story Y.Z":
|
|
91
91
|
|
|
92
|
-
1. Read
|
|
93
|
-
2.
|
|
94
|
-
3.
|
|
95
|
-
4.
|
|
96
|
-
5.
|
|
92
|
+
1. Read \`docs/PROJECT_STATUS.md\` — know which story to open
|
|
93
|
+
2. Open story file in \`docs/stories/STORY-*.md\` — full implementation context
|
|
94
|
+
3. Validate dependencies (depends_on field must all be done)
|
|
95
|
+
4. Activate agent indicated in story file's \`agent\` field
|
|
96
|
+
5. Implement following agent rules
|
|
97
|
+
6. Run finish_task.py to update backlog + story + PROJECT_STATUS
|
|
98
|
+
|
|
99
|
+
> Backlog is just an index of checkboxes. Never read it for implementation context.
|
|
97
100
|
|
|
98
101
|
## Post-Define Flow
|
|
99
102
|
|
|
100
|
-
After \`/define
|
|
101
|
-
1. \`/track\` —
|
|
102
|
-
2.
|
|
103
|
-
3. Start implementing Story 1.1
|
|
103
|
+
After \`/define\`:
|
|
104
|
+
1. \`/track\` — Verify progress
|
|
105
|
+
2. Start implementing (PROJECT_STATUS tells you which story is next)
|
|
104
106
|
`;
|
|
105
107
|
return { contents: [{ uri: "inove://system-prompt", text: prompt, mimeType: "text/markdown" }] };
|
|
106
108
|
});
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for Inove AI Framework.
|
|
4
|
+
*
|
|
5
|
+
* Dispatches commands:
|
|
6
|
+
* npx @joelbonito/mcp-server install # Full framework install
|
|
7
|
+
* npx @joelbonito/mcp-server update # Update framework (preserves instruction files)
|
|
8
|
+
* npx @joelbonito/mcp-server init # MCP-only mode (lightweight bootstrap)
|
|
9
|
+
*
|
|
10
|
+
* The MCP server itself runs via `inove-mcp` (dist/index.js).
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for Inove AI Framework.
|
|
4
|
+
*
|
|
5
|
+
* Dispatches commands:
|
|
6
|
+
* npx @joelbonito/mcp-server install # Full framework install
|
|
7
|
+
* npx @joelbonito/mcp-server update # Update framework (preserves instruction files)
|
|
8
|
+
* npx @joelbonito/mcp-server init # MCP-only mode (lightweight bootstrap)
|
|
9
|
+
*
|
|
10
|
+
* The MCP server itself runs via `inove-mcp` (dist/index.js).
|
|
11
|
+
*/
|
|
12
|
+
import { writeFileSync, existsSync } from "node:fs";
|
|
13
|
+
import { resolve } from "node:path";
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// MCP-only init (lightweight bootstrap)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const WORKFLOWS = [
|
|
18
|
+
"define", "debug", "create", "brainstorm", "enhance", "deploy",
|
|
19
|
+
"test", "track", "status", "log", "finish", "orchestrate", "plan",
|
|
20
|
+
"preview", "ui-ux-pro-max", "review", "test-book", "release",
|
|
21
|
+
"squad", "context", "readiness", "journeys",
|
|
22
|
+
];
|
|
23
|
+
const AGENTS = [
|
|
24
|
+
"orchestrator", "project-planner", "product-manager",
|
|
25
|
+
"frontend-specialist", "backend-specialist", "database-architect",
|
|
26
|
+
"mobile-developer", "security-auditor", "debugger", "devops-engineer",
|
|
27
|
+
"test-engineer", "qa-automation-engineer", "documentation-writer",
|
|
28
|
+
"code-archaeologist", "performance-optimizer", "seo-specialist",
|
|
29
|
+
"penetration-tester", "game-developer", "product-owner",
|
|
30
|
+
"ux-researcher", "explorer-agent", "n8n-specialist",
|
|
31
|
+
];
|
|
32
|
+
const SHARED_RULES = `
|
|
33
|
+
## Slash Commands — Workflow Invocation
|
|
34
|
+
|
|
35
|
+
When the user types \`/<command>\` (e.g. \`/define\`, \`/debug\`), use the MCP tool \`execute_workflow\` with the command name (without the slash) and any arguments.
|
|
36
|
+
|
|
37
|
+
Example: \`/define App de gestao de tarefas\` → call \`execute_workflow(name="define", arguments="App de gestao de tarefas")\`
|
|
38
|
+
|
|
39
|
+
Available workflows: ${WORKFLOWS.map((w) => `\`/${w}\``).join(", ")}
|
|
40
|
+
|
|
41
|
+
## Agent Activation — @ Mentions
|
|
42
|
+
|
|
43
|
+
When the user mentions \`@agent-name\` (e.g. \`@frontend-specialist\`), use the MCP tool \`activate_agent\` with the agent name. This loads the agent's full persona, rules and all referenced skills.
|
|
44
|
+
|
|
45
|
+
Example: \`@security-auditor\` → call \`activate_agent(name="security-auditor")\`
|
|
46
|
+
|
|
47
|
+
Available agents: ${AGENTS.map((a) => `\`@${a}\``).join(", ")}
|
|
48
|
+
|
|
49
|
+
## Intelligent Routing
|
|
50
|
+
|
|
51
|
+
When unsure which agent to use, call \`route_task\` with the user's request. It returns the best-matching agents based on keyword analysis.
|
|
52
|
+
|
|
53
|
+
## Operational Rules
|
|
54
|
+
|
|
55
|
+
For full framework behavior (Socratic Gate, Clean Code, Routing Protocol), read the MCP resource \`inove://system-prompt\`.
|
|
56
|
+
|
|
57
|
+
## Socratic Gate (MANDATORY)
|
|
58
|
+
|
|
59
|
+
For ALL requests involving code, STOP and ASK first:
|
|
60
|
+
|
|
61
|
+
| Request Type | Strategy | Action |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| New Feature / Build | Deep Discovery | ASK minimum 3 strategic questions |
|
|
64
|
+
| Edit / Bug Fix | Diagnosis | Present DIAGNOSIS + PROPOSAL → wait for approval |
|
|
65
|
+
| Vague / Simple | Clarification | Ask Purpose, Users and Scope |
|
|
66
|
+
|
|
67
|
+
## Clean Code (Global)
|
|
68
|
+
|
|
69
|
+
- Concise, self-documenting code — no over-engineering
|
|
70
|
+
- Tests mandatory (Unit > Integration > E2E)
|
|
71
|
+
- Code comments and variables in English
|
|
72
|
+
- Respond in the user's language
|
|
73
|
+
`;
|
|
74
|
+
function mcpInit(args) {
|
|
75
|
+
const claudeOnly = args.includes("--claude");
|
|
76
|
+
const codexOnly = args.includes("--codex");
|
|
77
|
+
const both = !claudeOnly && !codexOnly;
|
|
78
|
+
const cwd = process.cwd();
|
|
79
|
+
let created = 0;
|
|
80
|
+
const header = `# Inove AI Framework (MCP Mode)
|
|
81
|
+
|
|
82
|
+
> This project uses the Inove AI Framework via MCP server (\`@joelbonito/mcp-server\`).
|
|
83
|
+
> No local framework files needed — all agents, skills and workflows are served via MCP.
|
|
84
|
+
`;
|
|
85
|
+
const files = [
|
|
86
|
+
{ name: "CLAUDE.md", condition: both || claudeOnly },
|
|
87
|
+
{ name: "AGENTS.md", condition: both || codexOnly },
|
|
88
|
+
{ name: "GEMINI.md", condition: both },
|
|
89
|
+
];
|
|
90
|
+
for (const { name, condition } of files) {
|
|
91
|
+
if (!condition)
|
|
92
|
+
continue;
|
|
93
|
+
const path = resolve(cwd, name);
|
|
94
|
+
if (existsSync(path)) {
|
|
95
|
+
console.log(` ${name} already exists — skipping`);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
writeFileSync(path, header + SHARED_RULES, "utf-8");
|
|
99
|
+
console.log(` Created ${name}`);
|
|
100
|
+
created++;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (created > 0) {
|
|
104
|
+
console.log(`\nInove AI Framework (MCP Mode) initialized!`);
|
|
105
|
+
console.log(`Now you can use /slash commands and @agent mentions.\n`);
|
|
106
|
+
console.log(`Make sure the MCP server is configured:`);
|
|
107
|
+
console.log(` claude mcp add inove-ai -- npx -y @joelbonito/mcp-server`);
|
|
108
|
+
console.log(` codex mcp add inove-ai -- npx -y @joelbonito/mcp-server`);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(`\nNothing to create — files already exist.`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Main dispatcher
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
async function main() {
|
|
118
|
+
const args = process.argv.slice(2);
|
|
119
|
+
const command = args[0];
|
|
120
|
+
switch (command) {
|
|
121
|
+
case "install":
|
|
122
|
+
case "update": {
|
|
123
|
+
// Dynamic import to avoid loading registry.ts for non-install commands
|
|
124
|
+
const { installFramework } = await import("./install.js");
|
|
125
|
+
installFramework(process.cwd(), command === "update");
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "init":
|
|
129
|
+
mcpInit(args.slice(1));
|
|
130
|
+
break;
|
|
131
|
+
default:
|
|
132
|
+
console.log(`Inove AI Framework CLI\n`);
|
|
133
|
+
console.log(`Usage:`);
|
|
134
|
+
console.log(` npx @joelbonito/mcp-server install Full framework install (agents, skills, workflows, scripts)`);
|
|
135
|
+
console.log(` npx @joelbonito/mcp-server update Update framework (preserves CLAUDE.md, AGENTS.md, GEMINI.md)`);
|
|
136
|
+
console.log(` npx @joelbonito/mcp-server init MCP-only mode (lightweight bootstrap files)`);
|
|
137
|
+
console.log(``);
|
|
138
|
+
console.log(`The MCP server runs automatically when configured in your AI tool.`);
|
|
139
|
+
process.exit(command ? 1 : 0);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
main().catch((err) => {
|
|
143
|
+
console.error("Error:", err.message);
|
|
144
|
+
process.exit(1);
|
|
145
|
+
});
|
|
146
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Full framework installer for Inove AI Framework.
|
|
4
|
+
*
|
|
5
|
+
* Extracts the embedded content from registry.ts and writes it to disk,
|
|
6
|
+
* creating the full .agents/ structure, instruction files, and symlinks.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @joelbonito/mcp-server install # Full install
|
|
10
|
+
* npx @joelbonito/mcp-server update # Update (preserves CLAUDE.md, AGENTS.md, GEMINI.md)
|
|
11
|
+
*/
|
|
12
|
+
export declare function installFramework(cwd: string, isUpdate: boolean): void;
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Full framework installer for Inove AI Framework.
|
|
4
|
+
*
|
|
5
|
+
* Extracts the embedded content from registry.ts and writes it to disk,
|
|
6
|
+
* creating the full .agents/ structure, instruction files, and symlinks.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @joelbonito/mcp-server install # Full install
|
|
10
|
+
* npx @joelbonito/mcp-server update # Update (preserves CLAUDE.md, AGENTS.md, GEMINI.md)
|
|
11
|
+
*/
|
|
12
|
+
import { writeFileSync, mkdirSync, existsSync, symlinkSync, readlinkSync, unlinkSync, lstatSync } from "node:fs";
|
|
13
|
+
import { resolve, join, dirname } from "node:path";
|
|
14
|
+
import { EMBEDDED_AGENTS, EMBEDDED_SKILLS, EMBEDDED_WORKFLOWS, EMBEDDED_ARCHITECTURE, EMBEDDED_INSTRUCTIONS, EMBEDDED_SCRIPTS, EMBEDDED_CONFIG, EMBEDDED_ROOT_FILES, EMBEDDED_SQUAD_TEMPLATES, } from "./registry.js";
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Helpers
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
function ensureDir(dir) {
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
function writeFile(path, content) {
|
|
22
|
+
ensureDir(dirname(path));
|
|
23
|
+
writeFileSync(path, content, "utf-8");
|
|
24
|
+
}
|
|
25
|
+
function ensureSymlink(target, linkPath) {
|
|
26
|
+
ensureDir(dirname(linkPath));
|
|
27
|
+
if (lstatSync(linkPath, { throwIfNoEntry: false })?.isSymbolicLink()) {
|
|
28
|
+
const current = readlinkSync(linkPath);
|
|
29
|
+
if (current === target)
|
|
30
|
+
return; // already correct
|
|
31
|
+
unlinkSync(linkPath);
|
|
32
|
+
}
|
|
33
|
+
else if (existsSync(linkPath)) {
|
|
34
|
+
return; // real directory exists, don't replace
|
|
35
|
+
}
|
|
36
|
+
symlinkSync(target, linkPath);
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Install logic
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
export function installFramework(cwd, isUpdate) {
|
|
42
|
+
const agentsDir = resolve(cwd, ".agents");
|
|
43
|
+
let created = 0;
|
|
44
|
+
let updated = 0;
|
|
45
|
+
let skipped = 0;
|
|
46
|
+
function writeIfNeeded(path, content, preserve) {
|
|
47
|
+
if (preserve && existsSync(path)) {
|
|
48
|
+
skipped++;
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const existed = existsSync(path);
|
|
52
|
+
writeFile(path, content);
|
|
53
|
+
if (existed)
|
|
54
|
+
updated++;
|
|
55
|
+
else
|
|
56
|
+
created++;
|
|
57
|
+
}
|
|
58
|
+
console.log(`\n${isUpdate ? "Updating" : "Installing"} Inove AI Framework...`);
|
|
59
|
+
console.log(`Target: ${cwd}\n`);
|
|
60
|
+
// --- 1. Agents ---
|
|
61
|
+
console.log("[1/8] Agents");
|
|
62
|
+
for (const [name, content] of Object.entries(EMBEDDED_AGENTS)) {
|
|
63
|
+
writeIfNeeded(join(agentsDir, "agents", `${name}.md`), content, false);
|
|
64
|
+
}
|
|
65
|
+
console.log(` ${Object.keys(EMBEDDED_AGENTS).length} agents`);
|
|
66
|
+
// --- 2. Skills (SKILL.md + sub-files + scripts) ---
|
|
67
|
+
console.log("[2/8] Skills");
|
|
68
|
+
for (const [name, data] of Object.entries(EMBEDDED_SKILLS)) {
|
|
69
|
+
const skillDir = join(agentsDir, "skills", name);
|
|
70
|
+
writeIfNeeded(join(skillDir, "SKILL.md"), data.skill, false);
|
|
71
|
+
for (const [subName, subContent] of Object.entries(data.subFiles)) {
|
|
72
|
+
writeIfNeeded(join(skillDir, subName), subContent, false);
|
|
73
|
+
}
|
|
74
|
+
if (data.scripts && Object.keys(data.scripts).length > 0) {
|
|
75
|
+
for (const [scriptName, scriptContent] of Object.entries(data.scripts)) {
|
|
76
|
+
writeIfNeeded(join(skillDir, "scripts", scriptName), scriptContent, false);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
console.log(` ${Object.keys(EMBEDDED_SKILLS).length} skills`);
|
|
81
|
+
// --- 3. Workflows ---
|
|
82
|
+
console.log("[3/8] Workflows");
|
|
83
|
+
for (const [name, content] of Object.entries(EMBEDDED_WORKFLOWS)) {
|
|
84
|
+
writeIfNeeded(join(agentsDir, "workflows", `${name}.md`), content, false);
|
|
85
|
+
}
|
|
86
|
+
console.log(` ${Object.keys(EMBEDDED_WORKFLOWS).length} workflows`);
|
|
87
|
+
// --- 4. Scripts ---
|
|
88
|
+
console.log("[4/8] Scripts");
|
|
89
|
+
for (const [name, content] of Object.entries(EMBEDDED_SCRIPTS)) {
|
|
90
|
+
writeIfNeeded(join(agentsDir, "scripts", name), content, false);
|
|
91
|
+
}
|
|
92
|
+
console.log(` ${Object.keys(EMBEDDED_SCRIPTS).length} scripts`);
|
|
93
|
+
// --- 5. Core docs ---
|
|
94
|
+
console.log("[5/8] Core docs");
|
|
95
|
+
writeIfNeeded(join(agentsDir, "ARCHITECTURE.md"), EMBEDDED_ARCHITECTURE, false);
|
|
96
|
+
writeIfNeeded(join(agentsDir, "INSTRUCTIONS.md"), EMBEDDED_INSTRUCTIONS, false);
|
|
97
|
+
console.log(" ARCHITECTURE.md, INSTRUCTIONS.md");
|
|
98
|
+
// --- 6. Config ---
|
|
99
|
+
console.log("[6/8] Config");
|
|
100
|
+
for (const [name, content] of Object.entries(EMBEDDED_CONFIG)) {
|
|
101
|
+
writeIfNeeded(join(agentsDir, "config", name), content, false);
|
|
102
|
+
}
|
|
103
|
+
console.log(` ${Object.keys(EMBEDDED_CONFIG).length} config files`);
|
|
104
|
+
// --- 7. Root instruction files (preserve on update) ---
|
|
105
|
+
console.log("[7/8] Instruction files");
|
|
106
|
+
for (const [name, content] of Object.entries(EMBEDDED_ROOT_FILES)) {
|
|
107
|
+
const preserve = isUpdate; // on update, don't overwrite user's custom files
|
|
108
|
+
writeIfNeeded(resolve(cwd, name), content, preserve);
|
|
109
|
+
if (preserve && existsSync(resolve(cwd, name))) {
|
|
110
|
+
console.log(` ${name} — preserved (user custom)`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
console.log(` ${name}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// --- 8. Symlinks + Squad templates ---
|
|
117
|
+
console.log("[8/8] Symlinks & squad templates");
|
|
118
|
+
// .claude/ symlinks
|
|
119
|
+
ensureSymlink(join("..", ".agents", "agents"), resolve(cwd, ".claude", "agents"));
|
|
120
|
+
ensureSymlink(join("..", ".agents", "skills"), resolve(cwd, ".claude", "skills"));
|
|
121
|
+
console.log(" .claude/agents -> .agents/agents");
|
|
122
|
+
console.log(" .claude/skills -> .agents/skills");
|
|
123
|
+
// .claude/project_instructions.md (pointer file)
|
|
124
|
+
const pointerContent = `# Claude Code Project Instructions\n\n> This file points Claude Code to the master instructions.\n> Do NOT duplicate content here.\n\nSee [CLAUDE.md](../CLAUDE.md) for all project instructions.\n`;
|
|
125
|
+
writeIfNeeded(resolve(cwd, ".claude", "project_instructions.md"), pointerContent, isUpdate);
|
|
126
|
+
// .codex/ symlinks (optional)
|
|
127
|
+
ensureSymlink(join("..", ".agents", "agents"), resolve(cwd, ".codex", "agents"));
|
|
128
|
+
ensureSymlink(join("..", ".agents", "skills"), resolve(cwd, ".codex", "skills"));
|
|
129
|
+
ensureSymlink(join("..", ".agents", "workflows"), resolve(cwd, ".codex", "prompts"));
|
|
130
|
+
console.log(" .codex/agents -> .agents/agents");
|
|
131
|
+
console.log(" .codex/skills -> .agents/skills");
|
|
132
|
+
console.log(" .codex/prompts -> .agents/workflows");
|
|
133
|
+
// Squad templates
|
|
134
|
+
ensureDir(resolve(cwd, "squads", ".templates"));
|
|
135
|
+
for (const [relPath, content] of Object.entries(EMBEDDED_SQUAD_TEMPLATES)) {
|
|
136
|
+
writeIfNeeded(resolve(cwd, "squads", ".templates", relPath), content, false);
|
|
137
|
+
}
|
|
138
|
+
// squads/README.md
|
|
139
|
+
const squadsReadme = `# Squads\n\nSquads are reusable packages of agents + skills + workflows for specific domains.\n\nUse \`/squad create <name>\` to create a new squad from templates in \`.templates/\`.\n`;
|
|
140
|
+
writeIfNeeded(resolve(cwd, "squads", "README.md"), squadsReadme, isUpdate);
|
|
141
|
+
console.log(` ${Object.keys(EMBEDDED_SQUAD_TEMPLATES).length} squad template files`);
|
|
142
|
+
// --- Summary ---
|
|
143
|
+
console.log("\n" + "=".repeat(50));
|
|
144
|
+
console.log(`Inove AI Framework ${isUpdate ? "updated" : "installed"}!`);
|
|
145
|
+
console.log(` Created: ${created}`);
|
|
146
|
+
console.log(` Updated: ${updated}`);
|
|
147
|
+
console.log(` Preserved: ${skipped}`);
|
|
148
|
+
console.log("=".repeat(50));
|
|
149
|
+
console.log(`
|
|
150
|
+
Next steps:
|
|
151
|
+
1. Configure MCP server (for enhanced AI integration):
|
|
152
|
+
claude mcp add inove-ai -- npx -y @joelbonito/mcp-server
|
|
153
|
+
codex mcp add inove-ai -- npx -y @joelbonito/mcp-server
|
|
154
|
+
|
|
155
|
+
2. Validate installation:
|
|
156
|
+
python3 .agents/scripts/validate_installation.py
|
|
157
|
+
|
|
158
|
+
3. Start working:
|
|
159
|
+
/define <your project description>
|
|
160
|
+
`);
|
|
161
|
+
}
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
// CLI
|
|
164
|
+
// ---------------------------------------------------------------------------
|
|
165
|
+
function main() {
|
|
166
|
+
const args = process.argv.slice(2);
|
|
167
|
+
const command = args[0];
|
|
168
|
+
if (command === "install") {
|
|
169
|
+
installFramework(process.cwd(), false);
|
|
170
|
+
}
|
|
171
|
+
else if (command === "update") {
|
|
172
|
+
if (!existsSync(resolve(process.cwd(), ".agents"))) {
|
|
173
|
+
console.error("No .agents/ directory found. Use 'install' first.");
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
installFramework(process.cwd(), true);
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
console.log("Usage:");
|
|
180
|
+
console.log(" npx @joelbonito/mcp-server install # Full install");
|
|
181
|
+
console.log(" npx @joelbonito/mcp-server update # Update (preserves instruction files)");
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
main();
|
|
186
|
+
//# sourceMappingURL=install.js.map
|
package/dist/registry.d.ts
CHANGED
|
@@ -3,7 +3,12 @@ export declare const EMBEDDED_SKILLS: Record<string, {
|
|
|
3
3
|
skill: string;
|
|
4
4
|
subFiles: Record<string, string>;
|
|
5
5
|
hasScripts: boolean;
|
|
6
|
+
scripts: Record<string, string>;
|
|
6
7
|
}>;
|
|
7
8
|
export declare const EMBEDDED_WORKFLOWS: Record<string, string>;
|
|
8
9
|
export declare const EMBEDDED_ARCHITECTURE: string;
|
|
9
10
|
export declare const EMBEDDED_INSTRUCTIONS: string;
|
|
11
|
+
export declare const EMBEDDED_SCRIPTS: Record<string, string>;
|
|
12
|
+
export declare const EMBEDDED_CONFIG: Record<string, string>;
|
|
13
|
+
export declare const EMBEDDED_ROOT_FILES: Record<string, string>;
|
|
14
|
+
export declare const EMBEDDED_SQUAD_TEMPLATES: Record<string, string>;
|