nomoreide 0.1.43 → 0.1.45

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 (37) hide show
  1. package/dist/core/config-store.d.ts +3 -0
  2. package/dist/core/config-store.js +25 -0
  3. package/dist/core/config-store.js.map +1 -1
  4. package/dist/core/git-manager.d.ts +1 -0
  5. package/dist/core/git-manager.js +9 -0
  6. package/dist/core/git-manager.js.map +1 -1
  7. package/dist/core/github-manager.d.ts +114 -0
  8. package/dist/core/github-manager.js +161 -0
  9. package/dist/core/github-manager.js.map +1 -0
  10. package/dist/core/types.d.ts +5 -0
  11. package/dist/mcp/tools/docs.d.ts +29 -0
  12. package/dist/mcp/tools/docs.js +113 -0
  13. package/dist/mcp/tools/docs.js.map +1 -0
  14. package/dist/mcp/tools/github.d.ts +4 -0
  15. package/dist/mcp/tools/github.js +191 -0
  16. package/dist/mcp/tools/github.js.map +1 -0
  17. package/dist/mcp/tools/index.d.ts +1 -1
  18. package/dist/mcp/tools/index.js +6 -0
  19. package/dist/mcp/tools/index.js.map +1 -1
  20. package/dist/web/agent-info.d.ts +14 -0
  21. package/dist/web/agent-info.js +93 -1
  22. package/dist/web/agent-info.js.map +1 -1
  23. package/dist/web/client/assets/{code-editor-DZKblTe9.js → code-editor-B5xQq21I.js} +1 -1
  24. package/dist/web/client/assets/index-D6O1I2RP.css +1 -0
  25. package/dist/web/client/assets/index-DApri4U3.js +197 -0
  26. package/dist/web/client/index.html +2 -2
  27. package/dist/web/routes/github-context.d.ts +9 -0
  28. package/dist/web/routes/github-context.js +31 -0
  29. package/dist/web/routes/github-context.js.map +1 -0
  30. package/dist/web/routes/github-routes.d.ts +2 -0
  31. package/dist/web/routes/github-routes.js +302 -0
  32. package/dist/web/routes/github-routes.js.map +1 -0
  33. package/dist/web/routes/index.js +2 -0
  34. package/dist/web/routes/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/web/client/assets/index-Dj3f-wh2.css +0 -1
  37. package/dist/web/client/assets/index-WULLTGlU.js +0 -156
@@ -0,0 +1,113 @@
1
+ import { z } from "zod";
2
+ import { stringify } from "./context.js";
3
+ export const DOC_TOOL_NAMES = ["nomoreide_docs"];
4
+ const docsLinks = {
5
+ humanDocs: "https://www.nomoreide.com/docs",
6
+ llmsIndex: "https://www.nomoreide.com/llms.txt",
7
+ fullAiDocs: "https://www.nomoreide.com/llms-full.txt",
8
+ aiAgentGuide: "https://www.nomoreide.com/docs/ai-guide.md",
9
+ github: "https://github.com/Rorogogogo/nomoreide",
10
+ npm: "https://www.npmjs.com/package/nomoreide",
11
+ };
12
+ const docsTopicSchema = z.enum([
13
+ "overview",
14
+ "setup",
15
+ "mcp",
16
+ "cli",
17
+ "dashboard",
18
+ "tools",
19
+ "safety",
20
+ "troubleshooting",
21
+ "architecture",
22
+ "ai-agent",
23
+ ]);
24
+ const topicEntries = [
25
+ {
26
+ id: "overview",
27
+ title: "Overview",
28
+ body: "NoMoreIDE is an AI-native local development workbench for services, logs, Git review, database inspection, terminal access, and MCP workflows. It gives humans and AI coding agents one shared local control surface.",
29
+ },
30
+ {
31
+ id: "setup",
32
+ title: "Setup",
33
+ body: "Run NoMoreIDE with `npx -y nomoreide`, install it globally with `npm install -g nomoreide`, or build from source with `npm install` and `npm run build`. Connect agents by registering a stdio MCP server that runs `npx -y nomoreide`.",
34
+ },
35
+ {
36
+ id: "mcp",
37
+ title: "MCP setup",
38
+ body: "NoMoreIDE MCP setup uses a local stdio server. Claude Code: `claude mcp add --transport stdio nomoreide -- npx -y nomoreide`. Codex CLI: `codex mcp add nomoreide -- npx -y nomoreide`. Gemini: add an MCP server named `nomoreide` with command `npx` and args `[\"-y\", \"nomoreide\"]`. Verify inside the agent with `/mcp`.",
39
+ },
40
+ {
41
+ id: "cli",
42
+ title: "CLI reference",
43
+ body: "NoMoreIDE CLI commands include `setup`, `web`, `tui`, `list`, `add service`, `add bundle`, `start`, `stop`, `restart`, `logs`, and `git` subcommands. Use `nomoreide add service` to register local, Docker Compose, or SSH-backed services.",
44
+ },
45
+ {
46
+ id: "dashboard",
47
+ title: "Dashboard",
48
+ body: "The NoMoreIDE dashboard runs locally and includes Services, Git Review, Error Inbox, Database, Terminal, Agent, and Docs pages. Use it to keep service state, logs, diffs, data, and agent context visible.",
49
+ },
50
+ {
51
+ id: "tools",
52
+ title: "MCP tool reference",
53
+ body: "NoMoreIDE exposes tools for services, repo onboarding, Git, errors, database inspection, UI lifecycle, and docs. Important tools include `nomoreide_list_services`, `nomoreide_status`, `nomoreide_service_health`, `nomoreide_read_logs`, `nomoreide_git_status`, `nomoreide_git_diff`, `nomoreide_db_tables`, `nomoreide_open_ui`, and `nomoreide_docs`.",
54
+ },
55
+ {
56
+ id: "safety",
57
+ title: "Safety model",
58
+ body: "NoMoreIDE avoids broad filesystem scans, does not kill external processes it did not start, reports port conflicts instead of terminating processes, omits destructive Git operations like hard reset, clean, force push, and branch deletion, and keeps database MCP tools read-only.",
59
+ },
60
+ {
61
+ id: "troubleshooting",
62
+ title: "Troubleshooting",
63
+ body: "For NoMoreIDE troubleshooting, if MCP tools do not appear, re-run setup, restart the agent, verify with `/mcp`, and check that `npx -y nomoreide` works. For service failures, check `nomoreide_service_health`, `nomoreide_read_logs`, and `nomoreide_timeline`. For dashboard port conflicts, use a custom port.",
64
+ },
65
+ {
66
+ id: "architecture",
67
+ title: "Architecture",
68
+ body: "NoMoreIDE has a shared core layer for config, processes, logs, Git, health, database inspection, timeline, and error inbox. The MCP server wraps those core modules as FastMCP tools. The web server serves a React dashboard and REST API over localhost.",
69
+ },
70
+ {
71
+ id: "ai-agent",
72
+ title: "AI agent guide",
73
+ body: "Agents should start with `nomoreide_list_services` and `nomoreide_status`, inspect health and logs before restarting services, inspect Git status and diffs before staging or committing, and prefer NoMoreIDE tools over ad hoc shell commands when an equivalent tool exists.",
74
+ },
75
+ ];
76
+ const topicMap = new Map(topicEntries.map((entry) => [entry.id, entry]));
77
+ export function buildNoMoreIdeDocs({ topic, }) {
78
+ const topics = topicEntries.map((entry) => ({
79
+ id: entry.id,
80
+ title: entry.title,
81
+ }));
82
+ if (!topic) {
83
+ return {
84
+ topic: "index",
85
+ title: "NoMoreIDE documentation index",
86
+ body: "NoMoreIDE is an AI-native local development workbench. Pass a topic to `nomoreide_docs` for focused docs, or fetch the canonical docs links included in this response.",
87
+ topics,
88
+ links: docsLinks,
89
+ };
90
+ }
91
+ const entry = topicMap.get(topic);
92
+ if (!entry) {
93
+ throw new Error(`Unknown NoMoreIDE docs topic: ${topic}`);
94
+ }
95
+ return {
96
+ topic: entry.id,
97
+ title: entry.title,
98
+ body: entry.body,
99
+ topics,
100
+ links: docsLinks,
101
+ };
102
+ }
103
+ export function registerDocTools(server, _ctx) {
104
+ server.addTool({
105
+ name: "nomoreide_docs",
106
+ description: "Return NoMoreIDE documentation for a topic, or a docs index with canonical links. Use this when you need to understand how NoMoreIDE works, which MCP tools exist, how setup works, or where to fetch the full docs.",
107
+ parameters: z.object({
108
+ topic: docsTopicSchema.optional().describe("Optional docs topic. Omit for the topic index and canonical docs links."),
109
+ }),
110
+ execute: async ({ topic }) => stringify(buildNoMoreIdeDocs({ topic })),
111
+ });
112
+ }
113
+ //# sourceMappingURL=docs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../../src/mcp/tools/docs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { FastMCP } from "fastmcp";
2
+ import { type ToolContext } from "./context.js";
3
+ export declare const GITHUB_TOOL_NAMES: readonly ["nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_list_issues", "nomoreide_github_get_issue", "nomoreide_github_list_issue_comments", "nomoreide_github_add_issue_comment", "nomoreide_github_create_issue", "nomoreide_github_get_commit_ci", "nomoreide_github_list_workflow_runs"];
4
+ export declare function registerGithubTools(server: FastMCP, ctx: ToolContext): void;
@@ -0,0 +1,191 @@
1
+ import { z } from "zod";
2
+ import { GitManager } from "../../core/git-manager.js";
3
+ import { GitHubManager, } from "../../core/github-manager.js";
4
+ import { stringify } from "./context.js";
5
+ export const GITHUB_TOOL_NAMES = [
6
+ "nomoreide_github_set_token",
7
+ "nomoreide_github_list_prs",
8
+ "nomoreide_github_get_pr",
9
+ "nomoreide_github_get_pr_diff",
10
+ "nomoreide_github_create_pr",
11
+ "nomoreide_github_list_issues",
12
+ "nomoreide_github_get_issue",
13
+ "nomoreide_github_list_issue_comments",
14
+ "nomoreide_github_add_issue_comment",
15
+ "nomoreide_github_create_issue",
16
+ "nomoreide_github_get_commit_ci",
17
+ "nomoreide_github_list_workflow_runs",
18
+ ];
19
+ const cwdSchema = z.object({
20
+ cwd: z.string().min(1).optional().describe("Git repository directory. Defaults to selected repository."),
21
+ });
22
+ async function buildManager(ctx, cwd) {
23
+ const config = await ctx.configStore.load();
24
+ const token = ctx.configStore.getGithubToken(config);
25
+ if (!token) {
26
+ throw new Error("No GitHub token configured. Use nomoreide_github_set_token first.");
27
+ }
28
+ const gitCwd = cwd ?? process.cwd();
29
+ const remoteUrl = await new GitManager(gitCwd).remoteUrl("origin");
30
+ if (!remoteUrl) {
31
+ throw new Error("No git remote 'origin' found in the repository.");
32
+ }
33
+ const parsed = GitHubManager.parseRemoteUrl(remoteUrl);
34
+ if (!parsed) {
35
+ throw new Error(`Could not parse GitHub remote URL: ${remoteUrl}`);
36
+ }
37
+ return {
38
+ manager: new GitHubManager(token, parsed.owner, parsed.repo),
39
+ owner: parsed.owner,
40
+ repo: parsed.repo,
41
+ };
42
+ }
43
+ export function registerGithubTools(server, ctx) {
44
+ const { configStore } = ctx;
45
+ server.addTool({
46
+ name: "nomoreide_github_set_token",
47
+ description: "Store a GitHub Personal Access Token (PAT) for API access.",
48
+ parameters: z.object({
49
+ token: z.string().min(1).describe("GitHub PAT (ghp_...)."),
50
+ host: z.string().min(1).default("github.com").describe("GitHub host (default: github.com)."),
51
+ }),
52
+ execute: async ({ token, host }) => {
53
+ await configStore.setGithubToken(host, token);
54
+ return `GitHub token stored for ${host}.`;
55
+ },
56
+ });
57
+ server.addTool({
58
+ name: "nomoreide_github_list_prs",
59
+ description: "List pull requests for the active GitHub repository.",
60
+ parameters: cwdSchema.extend({
61
+ state: z.enum(["open", "closed", "all"]).default("open").describe("PR state filter."),
62
+ page: z.number().int().positive().default(1),
63
+ }),
64
+ execute: async ({ cwd, state, page }) => {
65
+ const { manager } = await buildManager(ctx, cwd);
66
+ return stringify(await manager.listPRs(state, page));
67
+ },
68
+ });
69
+ server.addTool({
70
+ name: "nomoreide_github_get_pr",
71
+ description: "Get details for a pull request including review status.",
72
+ parameters: cwdSchema.extend({
73
+ number: z.number().int().positive().describe("Pull request number."),
74
+ }),
75
+ execute: async ({ cwd, number }) => {
76
+ const { manager } = await buildManager(ctx, cwd);
77
+ return stringify(await manager.getPR(number));
78
+ },
79
+ });
80
+ server.addTool({
81
+ name: "nomoreide_github_get_pr_diff",
82
+ description: "Get the unified diff for a pull request.",
83
+ parameters: cwdSchema.extend({
84
+ number: z.number().int().positive().describe("Pull request number."),
85
+ }),
86
+ execute: async ({ cwd, number }) => {
87
+ const { manager } = await buildManager(ctx, cwd);
88
+ return manager.getPRDiff(number);
89
+ },
90
+ });
91
+ server.addTool({
92
+ name: "nomoreide_github_create_pr",
93
+ description: "Create a pull request on GitHub.",
94
+ parameters: cwdSchema.extend({
95
+ title: z.string().min(1).describe("PR title."),
96
+ body: z.string().optional().describe("PR description (markdown)."),
97
+ head: z.string().min(1).describe("Source branch name."),
98
+ base: z.string().min(1).describe("Target branch (e.g. main)."),
99
+ draft: z.boolean().default(false).describe("Create as draft PR."),
100
+ }),
101
+ execute: async ({ cwd, title, body, head, base, draft }) => {
102
+ const { manager } = await buildManager(ctx, cwd);
103
+ const pr = await manager.createPR({ title, body, head, base, draft });
104
+ return `Created PR #${pr.number}: ${pr.html_url}`;
105
+ },
106
+ });
107
+ server.addTool({
108
+ name: "nomoreide_github_list_issues",
109
+ description: "List issues for the active GitHub repository.",
110
+ parameters: cwdSchema.extend({
111
+ state: z.enum(["open", "closed", "all"]).default("open").describe("Issue state filter."),
112
+ page: z.number().int().positive().default(1),
113
+ }),
114
+ execute: async ({ cwd, state, page }) => {
115
+ const { manager } = await buildManager(ctx, cwd);
116
+ return stringify(await manager.listIssues(state, page));
117
+ },
118
+ });
119
+ server.addTool({
120
+ name: "nomoreide_github_get_issue",
121
+ description: "Get details for a GitHub issue.",
122
+ parameters: cwdSchema.extend({
123
+ number: z.number().int().positive().describe("Issue number."),
124
+ }),
125
+ execute: async ({ cwd, number }) => {
126
+ const { manager } = await buildManager(ctx, cwd);
127
+ return stringify(await manager.getIssue(number));
128
+ },
129
+ });
130
+ server.addTool({
131
+ name: "nomoreide_github_list_issue_comments",
132
+ description: "List comments on a GitHub issue.",
133
+ parameters: cwdSchema.extend({
134
+ number: z.number().int().positive().describe("Issue number."),
135
+ }),
136
+ execute: async ({ cwd, number }) => {
137
+ const { manager } = await buildManager(ctx, cwd);
138
+ return stringify(await manager.listIssueComments(number));
139
+ },
140
+ });
141
+ server.addTool({
142
+ name: "nomoreide_github_add_issue_comment",
143
+ description: "Add a comment to a GitHub issue or pull request.",
144
+ parameters: cwdSchema.extend({
145
+ number: z.number().int().positive().describe("Issue or PR number."),
146
+ body: z.string().min(1).describe("Comment text (markdown)."),
147
+ }),
148
+ execute: async ({ cwd, number, body }) => {
149
+ const { manager } = await buildManager(ctx, cwd);
150
+ const comment = await manager.addIssueComment(number, body);
151
+ return `Comment added: ${comment.html_url}`;
152
+ },
153
+ });
154
+ server.addTool({
155
+ name: "nomoreide_github_create_issue",
156
+ description: "Create a new GitHub issue.",
157
+ parameters: cwdSchema.extend({
158
+ title: z.string().min(1).describe("Issue title."),
159
+ body: z.string().optional().describe("Issue description (markdown)."),
160
+ }),
161
+ execute: async ({ cwd, title, body }) => {
162
+ const { manager } = await buildManager(ctx, cwd);
163
+ const issue = await manager.createIssue({ title, body });
164
+ return `Created issue #${issue.number}: ${issue.html_url}`;
165
+ },
166
+ });
167
+ server.addTool({
168
+ name: "nomoreide_github_get_commit_ci",
169
+ description: "Get CI check status for a commit SHA.",
170
+ parameters: cwdSchema.extend({
171
+ sha: z.string().min(7).describe("Commit SHA (full or abbreviated to ≥7 chars)."),
172
+ }),
173
+ execute: async ({ cwd, sha }) => {
174
+ const { manager } = await buildManager(ctx, cwd);
175
+ return stringify(await manager.getCommitChecks(sha));
176
+ },
177
+ });
178
+ server.addTool({
179
+ name: "nomoreide_github_list_workflow_runs",
180
+ description: "List recent GitHub Actions workflow runs.",
181
+ parameters: cwdSchema.extend({
182
+ branch: z.string().optional().describe("Filter by branch name."),
183
+ page: z.number().int().positive().default(1),
184
+ }),
185
+ execute: async ({ cwd, branch, page }) => {
186
+ const { manager } = await buildManager(ctx, cwd);
187
+ return stringify(await manager.listWorkflowRuns(branch, page));
188
+ },
189
+ });
190
+ }
191
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../../src/mcp/tools/github.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ import { type ToolContext } from "./context.js";
9
9
  * a new domain module and register it below. This aggregator never grows a
10
10
  * per-tool branch.
11
11
  */
12
- export declare const NOMOREIDE_TOOL_NAMES: readonly ["nomoreide_list_services", "nomoreide_register_service", "nomoreide_start_service", "nomoreide_stop_service", "nomoreide_restart_service", "nomoreide_read_logs", "nomoreide_register_bundle", "nomoreide_start_bundle", "nomoreide_stop_bundle", "nomoreide_status", "nomoreide_service_context", "nomoreide_service_health", "nomoreide_timeline", "nomoreide_onboard_repo", "nomoreide_git_status", "nomoreide_git_branches", "nomoreide_git_switch_branch", "nomoreide_git_create_branch", "nomoreide_git_fetch", "nomoreide_git_diff", "nomoreide_git_staged_diff", "nomoreide_git_log", "nomoreide_git_stage", "nomoreide_git_unstage", "nomoreide_git_commit", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_list_errors", "nomoreide_error_prompt", "nomoreide_list_databases", "nomoreide_db_tables", "nomoreide_db_sample", "nomoreide_open_ui", "nomoreide_close_ui"];
12
+ export declare const NOMOREIDE_TOOL_NAMES: readonly ["nomoreide_list_services", "nomoreide_register_service", "nomoreide_start_service", "nomoreide_stop_service", "nomoreide_restart_service", "nomoreide_read_logs", "nomoreide_register_bundle", "nomoreide_start_bundle", "nomoreide_stop_bundle", "nomoreide_status", "nomoreide_service_context", "nomoreide_service_health", "nomoreide_timeline", "nomoreide_onboard_repo", "nomoreide_git_status", "nomoreide_git_branches", "nomoreide_git_switch_branch", "nomoreide_git_create_branch", "nomoreide_git_fetch", "nomoreide_git_diff", "nomoreide_git_staged_diff", "nomoreide_git_log", "nomoreide_git_stage", "nomoreide_git_unstage", "nomoreide_git_commit", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_list_issues", "nomoreide_github_get_issue", "nomoreide_github_list_issue_comments", "nomoreide_github_add_issue_comment", "nomoreide_github_create_issue", "nomoreide_github_get_commit_ci", "nomoreide_github_list_workflow_runs", "nomoreide_list_errors", "nomoreide_error_prompt", "nomoreide_list_databases", "nomoreide_db_tables", "nomoreide_db_sample", "nomoreide_docs", "nomoreide_open_ui", "nomoreide_close_ui"];
13
13
  interface RegisterNoMoreIdeToolsOptions extends ToolContext {
14
14
  server: FastMCP;
15
15
  toolCallStore?: ToolCallStore;
@@ -1,8 +1,10 @@
1
1
  import { wrapServerForRecording } from "./context.js";
2
2
  import { AGENT_TOOL_NAMES, registerAgentTools } from "./agent.js";
3
3
  import { DATABASE_TOOL_NAMES, registerDatabaseTools } from "./database.js";
4
+ import { DOC_TOOL_NAMES, registerDocTools } from "./docs.js";
4
5
  import { ERROR_TOOL_NAMES, registerErrorTools } from "./errors.js";
5
6
  import { GIT_TOOL_NAMES, registerGitTools } from "./git.js";
7
+ import { GITHUB_TOOL_NAMES, registerGithubTools } from "./github.js";
6
8
  import { ONBOARD_TOOL_NAMES, registerOnboardTools } from "./onboard.js";
7
9
  import { registerServiceTools, SERVICE_TOOL_NAMES } from "./services.js";
8
10
  /**
@@ -17,8 +19,10 @@ export const NOMOREIDE_TOOL_NAMES = [
17
19
  ...SERVICE_TOOL_NAMES,
18
20
  ...ONBOARD_TOOL_NAMES,
19
21
  ...GIT_TOOL_NAMES,
22
+ ...GITHUB_TOOL_NAMES,
20
23
  ...ERROR_TOOL_NAMES,
21
24
  ...DATABASE_TOOL_NAMES,
25
+ ...DOC_TOOL_NAMES,
22
26
  ...AGENT_TOOL_NAMES,
23
27
  ];
24
28
  export function registerNoMoreIdeTools(options) {
@@ -29,8 +33,10 @@ export function registerNoMoreIdeTools(options) {
29
33
  registerServiceTools(server, ctx);
30
34
  registerOnboardTools(server, ctx);
31
35
  registerGitTools(server, ctx);
36
+ registerGithubTools(server, ctx);
32
37
  registerErrorTools(server, ctx);
33
38
  registerDatabaseTools(server, ctx);
39
+ registerDocTools(server, ctx);
34
40
  registerAgentTools(server, ctx);
35
41
  }
36
42
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,gBAAgB;CACX,CAAC;AAOX,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,aAAa,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IAEd,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,GAAG,gBAAgB;CACX,CAAC;AAOX,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,aAAa,CAAC;QAClD,CAAC,CAAC,SAAS,CAAC;IAEd,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC"}
@@ -18,6 +18,19 @@ export interface AgentMcpServer {
18
18
  type?: string;
19
19
  url?: string;
20
20
  }
21
+ export interface AgentPlugin {
22
+ name: string;
23
+ marketplace?: string;
24
+ scope: "user" | "project";
25
+ version?: string;
26
+ installPath?: string;
27
+ description?: string;
28
+ /** Skills (dirs), slash commands, sub-agents, and MCP servers the plugin ships. */
29
+ skills: string[];
30
+ commands: string[];
31
+ agents: string[];
32
+ mcpServers: string[];
33
+ }
21
34
  export interface AgentProjectEntry {
22
35
  path: string;
23
36
  current: boolean;
@@ -38,6 +51,7 @@ export interface AgentProfile {
38
51
  };
39
52
  skills: AgentSkill[];
40
53
  mcpServers: AgentMcpServer[];
54
+ plugins: AgentPlugin[];
41
55
  projects: AgentProjectEntry[];
42
56
  }
43
57
  export interface AgentInfo extends AgentProfile {
@@ -9,9 +9,10 @@ export async function buildAgentInfo(cwd) {
9
9
  const detected = await detectAgent();
10
10
  const home = homedir();
11
11
  const codexHome = process.env.CODEX_HOME || join(home, ".codex");
12
- const [claudeProject, claudeSkills, claudeJson, codexProject, codexSkills, codexConfig, codexProjects,] = await Promise.all([
12
+ const [claudeProject, claudeSkills, claudePlugins, claudeJson, codexProject, codexSkills, codexConfig, codexProjects,] = await Promise.all([
13
13
  collectClaudeProjectMemory(cwd, home),
14
14
  collectClaudeSkills(home, cwd),
15
+ collectClaudePlugins(home),
15
16
  readClaudeJson(home),
16
17
  collectCodexProjectMemory(cwd, codexHome),
17
18
  collectCodexSkills(codexHome, cwd),
@@ -22,12 +23,14 @@ export async function buildAgentInfo(cwd) {
22
23
  project: claudeProject,
23
24
  skills: claudeSkills,
24
25
  mcpServers: collectClaudeMcpServers(claudeJson, cwd),
26
+ plugins: claudePlugins,
25
27
  projects: collectClaudeProjects(claudeJson, cwd),
26
28
  };
27
29
  const codexProfile = {
28
30
  project: codexProject,
29
31
  skills: codexSkills,
30
32
  mcpServers: collectCodexMcpServers(codexConfig),
33
+ plugins: [],
31
34
  projects: mergeCodexProjects(codexConfig, codexProjects, cwd),
32
35
  };
33
36
  const activeProfile = detected.name === "codex" ? codexProfile : claudeProfile;
@@ -275,6 +278,95 @@ async function readPluginSkills(pluginsDataDir, out) {
275
278
  // ignore
276
279
  }
277
280
  }
281
+ /**
282
+ * Claude's plugin registry lives at ~/.claude/plugins/installed_plugins.json,
283
+ * keyed by "<name>@<marketplace>". Each record points at an `installPath` whose
284
+ * `skills/`, `commands/`, `agents/`, and `.mcp.json` we enumerate so the UI can
285
+ * show what each plugin contributes. (Mirrors brainctl's plugin-skill-reader.)
286
+ */
287
+ async function collectClaudePlugins(home) {
288
+ const registryPath = join(home, ".claude", "plugins", "installed_plugins.json");
289
+ let data;
290
+ try {
291
+ data = JSON.parse(await readFile(registryPath, "utf8"));
292
+ }
293
+ catch {
294
+ return [];
295
+ }
296
+ const plugins = await Promise.all(Object.entries(data.plugins ?? {}).map(async ([key, records]) => {
297
+ const atIndex = key.lastIndexOf("@");
298
+ const name = atIndex > 0 ? key.slice(0, atIndex) : key;
299
+ const marketplace = atIndex > 0 ? key.slice(atIndex + 1) : undefined;
300
+ const record = records?.[0];
301
+ const installPath = record?.installPath;
302
+ const [skills, commands, agents, mcpServers, description] = await Promise.all([
303
+ installPath ? readPluginEntryNames(join(installPath, "skills"), "dir") : [],
304
+ installPath ? readPluginEntryNames(join(installPath, "commands"), "md") : [],
305
+ installPath ? readPluginEntryNames(join(installPath, "agents"), "md") : [],
306
+ installPath ? readPluginMcpKeys(installPath) : [],
307
+ installPath ? readPluginDescription(installPath) : undefined,
308
+ ]);
309
+ return {
310
+ name,
311
+ marketplace,
312
+ scope: record?.scope === "project" ? "project" : "user",
313
+ version: record?.version,
314
+ installPath,
315
+ description,
316
+ skills,
317
+ commands,
318
+ agents,
319
+ mcpServers,
320
+ };
321
+ }));
322
+ plugins.sort((a, b) => a.name.localeCompare(b.name));
323
+ return plugins;
324
+ }
325
+ /** List a plugin sub-dir's contributions: child directories, or *.md basenames. */
326
+ async function readPluginEntryNames(dir, kind) {
327
+ try {
328
+ const entries = await readdir(dir, { withFileTypes: true });
329
+ const names = entries
330
+ .filter((entry) => {
331
+ if (entry.name.startsWith("."))
332
+ return false;
333
+ return kind === "dir"
334
+ ? entry.isDirectory()
335
+ : entry.isFile() && entry.name.endsWith(".md");
336
+ })
337
+ .map((entry) => (kind === "dir" ? entry.name : entry.name.replace(/\.md$/, "")));
338
+ return Array.from(new Set(names)).sort((a, b) => a.localeCompare(b));
339
+ }
340
+ catch {
341
+ return [];
342
+ }
343
+ }
344
+ /** MCP server keys a plugin ships in its bundled `.mcp.json`. */
345
+ async function readPluginMcpKeys(installPath) {
346
+ try {
347
+ const raw = await readFile(join(installPath, ".mcp.json"), "utf8");
348
+ const parsed = JSON.parse(raw);
349
+ const servers = parsed.mcpServers && typeof parsed.mcpServers === "object" && !Array.isArray(parsed.mcpServers)
350
+ ? parsed.mcpServers
351
+ : parsed;
352
+ return Object.keys(servers).sort((a, b) => a.localeCompare(b));
353
+ }
354
+ catch {
355
+ return [];
356
+ }
357
+ }
358
+ async function readPluginDescription(installPath) {
359
+ const content = await safeReadPreview(join(installPath, ".claude-plugin", "plugin.json"), 4000);
360
+ if (!content)
361
+ return undefined;
362
+ try {
363
+ const parsed = JSON.parse(content);
364
+ return typeof parsed.description === "string" ? parsed.description : undefined;
365
+ }
366
+ catch {
367
+ return undefined;
368
+ }
369
+ }
278
370
  async function readSkillDescription(skillDir) {
279
371
  const skillFile = join(skillDir, "SKILL.md");
280
372
  const content = await safeReadPreview(skillFile, 400);