nomoreide 0.1.70 → 0.1.71

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 (35) hide show
  1. package/dist/core/agent-profiles/apply.d.ts +36 -0
  2. package/dist/core/agent-profiles/apply.js +160 -0
  3. package/dist/core/agent-profiles/apply.js.map +1 -0
  4. package/dist/core/agent-profiles/credentials.d.ts +26 -0
  5. package/dist/core/agent-profiles/credentials.js +151 -0
  6. package/dist/core/agent-profiles/credentials.js.map +1 -0
  7. package/dist/core/agent-profiles/index.d.ts +10 -0
  8. package/dist/core/agent-profiles/index.js +11 -0
  9. package/dist/core/agent-profiles/index.js.map +1 -0
  10. package/dist/core/agent-profiles/store.d.ts +35 -0
  11. package/dist/core/agent-profiles/store.js +210 -0
  12. package/dist/core/agent-profiles/store.js.map +1 -0
  13. package/dist/core/agent-profiles/transfer.d.ts +26 -0
  14. package/dist/core/agent-profiles/transfer.js +141 -0
  15. package/dist/core/agent-profiles/transfer.js.map +1 -0
  16. package/dist/core/agent-profiles/types.d.ts +250 -0
  17. package/dist/core/agent-profiles/types.js +63 -0
  18. package/dist/core/agent-profiles/types.js.map +1 -0
  19. package/dist/mcp/tools/agent-profiles.d.ts +9 -0
  20. package/dist/mcp/tools/agent-profiles.js +165 -0
  21. package/dist/mcp/tools/agent-profiles.js.map +1 -0
  22. package/dist/mcp/tools/index.d.ts +1 -1
  23. package/dist/mcp/tools/index.js +3 -0
  24. package/dist/mcp/tools/index.js.map +1 -1
  25. package/dist/web/client/assets/{code-editor-tF2NdMJV.js → code-editor-B0j6kcLb.js} +1 -1
  26. package/dist/web/client/assets/{index-CQmdoyuK.js → index-DAiSqTLR.js} +139 -139
  27. package/dist/web/client/assets/index-n7aEcfkd.css +1 -0
  28. package/dist/web/client/index.html +2 -2
  29. package/dist/web/routes/agent-profile-routes.d.ts +8 -0
  30. package/dist/web/routes/agent-profile-routes.js +180 -0
  31. package/dist/web/routes/agent-profile-routes.js.map +1 -0
  32. package/dist/web/routes/index.js +2 -0
  33. package/dist/web/routes/index.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/web/client/assets/index-C7lI87cF.css +0 -1
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Agent Profiles (ROR-62) — named bundles of MCP servers + skills that can be
3
+ * saved, applied to agents, and shared as portable `.tar.gz` archives.
4
+ *
5
+ * Profiles use nomoreide's own vocabulary (the same local/remote MCP shapes
6
+ * the agent-env readers emit) and are stored as Zod-validated JSON under
7
+ * `~/.config/nomoreide/agent-profiles/<name>/`. This deliberately does NOT
8
+ * read brainctl's YAML profiles — brainctl users migrate by re-snapshotting
9
+ * their live agent configs (one call), which recreates the profile here.
10
+ */
11
+ import { z } from "zod";
12
+ const stringMapSchema = z.record(z.string());
13
+ export const profileLocalMcpSchema = z.object({
14
+ kind: z.literal("local"),
15
+ command: z.string().min(1),
16
+ args: z.array(z.string()).optional(),
17
+ env: stringMapSchema.optional(),
18
+ });
19
+ export const profileRemoteMcpSchema = z.object({
20
+ kind: z.literal("remote"),
21
+ transport: z.enum(["http", "sse"]),
22
+ url: z.string().min(1),
23
+ headers: stringMapSchema.optional(),
24
+ env: stringMapSchema.optional(),
25
+ });
26
+ export const profileMcpSchema = z.discriminatedUnion("kind", [
27
+ profileLocalMcpSchema,
28
+ profileRemoteMcpSchema,
29
+ ]);
30
+ /** A skill bundled with the profile; its files live at `<profile>/skills/<name>/`. */
31
+ export const profileSkillSchema = z.object({
32
+ name: z.string().min(1),
33
+ });
34
+ export const PROFILE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
35
+ export const profileSchema = z.object({
36
+ name: z.string().regex(PROFILE_NAME_PATTERN),
37
+ description: z.string().optional(),
38
+ mcps: z.record(profileMcpSchema).default({}),
39
+ skills: z.array(profileSkillSchema).default([]),
40
+ });
41
+ /** Credential a portable archive needs filled in at import time. */
42
+ export const credentialSpecSchema = z.object({
43
+ key: z.string().min(1),
44
+ required: z.boolean().default(true),
45
+ description: z.string().optional(),
46
+ });
47
+ /** `manifest.json` inside a portable archive. */
48
+ export const profileManifestSchema = z.object({
49
+ schemaVersion: z.literal(1),
50
+ profileName: z.string().min(1),
51
+ createdBy: z.object({ tool: z.string(), version: z.string() }).optional(),
52
+ credentials: z.array(credentialSpecSchema).optional(),
53
+ });
54
+ export function slugifyProfileName(input) {
55
+ return input
56
+ .trim()
57
+ .toLowerCase()
58
+ .replace(/[\s_]+/g, "-")
59
+ .replace(/[^a-z0-9.-]/g, "")
60
+ .replace(/-+/g, "-")
61
+ .replace(/^[-.]+|[-.]+$/g, "");
62
+ }
63
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAE7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE;IACnC,GAAG,EAAE,eAAe,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IAC3D,qBAAqB;IACrB,sBAAsB;CACvB,CAAC,CAAC;AAMH,sFAAsF;AACtF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CACxB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,8BAA8B,CAAC;AAEnE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAIH,oEAAoE;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAIH,iDAAiD;AACjD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC;AAYH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FastMCP } from "fastmcp";
2
+ import { type ToolContext } from "./context.js";
3
+ export declare const AGENT_PROFILE_TOOL_NAMES: readonly ["nomoreide_profiles_list", "nomoreide_profiles_get", "nomoreide_profiles_create", "nomoreide_profiles_update", "nomoreide_profiles_delete", "nomoreide_profiles_snapshot", "nomoreide_profiles_apply", "nomoreide_profiles_export", "nomoreide_profiles_import", "nomoreide_profiles_copy_items"];
4
+ /**
5
+ * Agent Profiles (ROR-62): named MCP+skill bundles. Mutations of agent
6
+ * configs (apply) flow through the write-guarded agent-env layer and echo
7
+ * backup paths; profile CRUD only touches `~/.config/nomoreide/agent-profiles/`.
8
+ */
9
+ export declare function registerAgentProfileTools(server: FastMCP, _ctx: ToolContext): void;
@@ -0,0 +1,165 @@
1
+ import { z } from "zod";
2
+ import { applyProfile, copySkillBetweenProfiles, createProfile, deleteProfile, exportProfile, getProfile, importProfile, listProfiles, previewProfileApply, profileMcpSchema, snapshotProfileFromAgent, updateProfile, } from "../../core/agent-profiles/index.js";
3
+ import { stringify } from "./context.js";
4
+ export const AGENT_PROFILE_TOOL_NAMES = [
5
+ "nomoreide_profiles_list",
6
+ "nomoreide_profiles_get",
7
+ "nomoreide_profiles_create",
8
+ "nomoreide_profiles_update",
9
+ "nomoreide_profiles_delete",
10
+ "nomoreide_profiles_snapshot",
11
+ "nomoreide_profiles_apply",
12
+ "nomoreide_profiles_export",
13
+ "nomoreide_profiles_import",
14
+ "nomoreide_profiles_copy_items",
15
+ ];
16
+ const agentSchema = z.enum(["claude", "codex", "antigravity"]);
17
+ const nameField = z.string().min(1).describe("Profile name.");
18
+ const cwdField = z
19
+ .string()
20
+ .min(1)
21
+ .optional()
22
+ .describe("Project directory (defaults to the server's cwd).");
23
+ /**
24
+ * Agent Profiles (ROR-62): named MCP+skill bundles. Mutations of agent
25
+ * configs (apply) flow through the write-guarded agent-env layer and echo
26
+ * backup paths; profile CRUD only touches `~/.config/nomoreide/agent-profiles/`.
27
+ */
28
+ export function registerAgentProfileTools(server, _ctx) {
29
+ server.addTool({
30
+ name: "nomoreide_profiles_list",
31
+ description: "List saved agent profiles (named bundles of MCP servers + skills).",
32
+ parameters: z.object({}),
33
+ execute: async () => stringify(await listProfiles()),
34
+ });
35
+ server.addTool({
36
+ name: "nomoreide_profiles_get",
37
+ description: "Get a profile's full config: MCP servers and bundled skills.",
38
+ parameters: z.object({ name: nameField }),
39
+ execute: async ({ name }) => stringify(await getProfile(name)),
40
+ });
41
+ server.addTool({
42
+ name: "nomoreide_profiles_create",
43
+ description: 'Create an empty profile. Name must match /^[A-Za-z0-9][A-Za-z0-9._-]*$/.',
44
+ parameters: z.object({ name: nameField, description: z.string().optional() }),
45
+ execute: async (input) => stringify(await createProfile(input)),
46
+ });
47
+ server.addTool({
48
+ name: "nomoreide_profiles_update",
49
+ description: "Update a profile's description, MCP map, or skill list (name is immutable).",
50
+ parameters: z.object({
51
+ name: nameField,
52
+ description: z.string().optional(),
53
+ mcps: z.record(profileMcpSchema).optional(),
54
+ skills: z.array(z.object({ name: z.string().min(1) })).optional(),
55
+ }),
56
+ execute: async ({ name, ...patch }) => stringify(await updateProfile(name, patch)),
57
+ });
58
+ server.addTool({
59
+ name: "nomoreide_profiles_delete",
60
+ description: "Delete a saved profile (does not touch any agent's live config).",
61
+ parameters: z.object({ name: nameField }),
62
+ execute: async ({ name }) => {
63
+ await deleteProfile(name);
64
+ return stringify({ ok: true, deleted: name });
65
+ },
66
+ });
67
+ server.addTool({
68
+ name: "nomoreide_profiles_snapshot",
69
+ description: "Snapshot an agent's live MCPs and user skills into a new profile — useful as a backup before bulk changes or to capture a setup for sharing.",
70
+ parameters: z.object({
71
+ agent: agentSchema,
72
+ name: nameField,
73
+ description: z.string().optional(),
74
+ cwd: cwdField,
75
+ }),
76
+ execute: async (input) => stringify(await snapshotProfileFromAgent({ ...input, cwd: input.cwd ?? process.cwd() })),
77
+ });
78
+ server.addTool({
79
+ name: "nomoreide_profiles_apply",
80
+ description: "Apply a profile's MCPs and skills to an agent. Set dryRun=true for a conflict preview (add/identical/conflict per item). A real apply snapshots the agent config first and returns every backup path.",
81
+ parameters: z.object({
82
+ name: nameField,
83
+ agent: agentSchema,
84
+ dryRun: z.boolean().default(false),
85
+ skipMcps: z.array(z.string()).optional().describe("MCP keys to leave untouched."),
86
+ skipSkills: z.array(z.string()).optional().describe("Skill names to leave untouched."),
87
+ cwd: cwdField,
88
+ }),
89
+ execute: async (input) => {
90
+ const cwd = input.cwd ?? process.cwd();
91
+ if (input.dryRun) {
92
+ return stringify(await previewProfileApply({ cwd, name: input.name, agent: input.agent }));
93
+ }
94
+ return stringify(await applyProfile({
95
+ cwd,
96
+ name: input.name,
97
+ agent: input.agent,
98
+ skip: { mcps: input.skipMcps, skills: input.skipSkills },
99
+ }));
100
+ },
101
+ });
102
+ server.addTool({
103
+ name: "nomoreide_profiles_export",
104
+ description: "Export a profile as a portable .tar.gz. Secret-looking env/header values are redacted to ${credentials.*} placeholders — the archive never contains raw secrets.",
105
+ parameters: z.object({
106
+ name: nameField,
107
+ outputPath: z.string().optional().describe("Defaults to <cwd>/<name>.tar.gz."),
108
+ cwd: cwdField,
109
+ }),
110
+ execute: async (input) => stringify(await exportProfile({
111
+ name: input.name,
112
+ outputPath: input.outputPath,
113
+ cwd: input.cwd ?? process.cwd(),
114
+ })),
115
+ });
116
+ server.addTool({
117
+ name: "nomoreide_profiles_import",
118
+ description: "Import a portable profile .tar.gz. Supplied credentials (or matching environment variables) fill ${credentials.*} placeholders; unresolved keys are reported.",
119
+ parameters: z.object({
120
+ archivePath: z.string().min(1),
121
+ force: z.boolean().default(false).describe("Overwrite an existing profile of the same name."),
122
+ as: z.string().optional().describe("Import under a different profile name."),
123
+ credentials: z.record(z.string()).optional(),
124
+ }),
125
+ execute: async (input) => stringify(await importProfile(input)),
126
+ });
127
+ server.addTool({
128
+ name: "nomoreide_profiles_copy_items",
129
+ description: "Copy selected MCPs and/or skills from one profile into another (overwrites same-named items in the target).",
130
+ parameters: z.object({
131
+ from: z.string().min(1),
132
+ to: z.string().min(1),
133
+ mcps: z.array(z.string()).optional().describe("MCP keys to copy."),
134
+ skills: z.array(z.string()).optional().describe("Skill names to copy."),
135
+ }),
136
+ execute: async (input) => {
137
+ const source = await getProfile(input.from);
138
+ const target = await getProfile(input.to);
139
+ const mcps = { ...target.mcps };
140
+ const copiedMcps = [];
141
+ for (const key of input.mcps ?? []) {
142
+ const entry = source.mcps[key];
143
+ if (!entry)
144
+ throw new Error(`MCP "${key}" not found in profile "${input.from}".`);
145
+ mcps[key] = entry;
146
+ copiedMcps.push(key);
147
+ }
148
+ const skills = [...target.skills];
149
+ const copiedSkills = [];
150
+ for (const skillName of input.skills ?? []) {
151
+ if (!source.skills.some((skill) => skill.name === skillName)) {
152
+ throw new Error(`Skill "${skillName}" not found in profile "${input.from}".`);
153
+ }
154
+ await copySkillBetweenProfiles(input.from, input.to, skillName);
155
+ if (!skills.some((skill) => skill.name === skillName)) {
156
+ skills.push({ name: skillName });
157
+ }
158
+ copiedSkills.push(skillName);
159
+ }
160
+ await updateProfile(input.to, { mcps, skills });
161
+ return stringify({ ok: true, copiedMcps, copiedSkills });
162
+ },
163
+ });
164
+ }
165
+ //# sourceMappingURL=agent-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-profiles.js","sourceRoot":"","sources":["../../../src/mcp/tools/agent-profiles.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,7 @@ import { type ToolContext } from "./context.js";
10
10
  * a new domain module and register it below. This aggregator never grows a
11
11
  * per-tool branch.
12
12
  */
13
- 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_push", "nomoreide_git_clone", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_snapshots_list", "nomoreide_snapshot_create", "nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_merge_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_db_query", "nomoreide_docs", "nomoreide_open_ui", "nomoreide_close_ui", "nomoreide_agents_status", "nomoreide_agents_read_configs", "nomoreide_agents_doctor", "nomoreide_agents_add_mcp", "nomoreide_agents_remove_mcp", "nomoreide_agents_move_mcp_scope", "nomoreide_agents_move_skill_scope", "nomoreide_agents_snapshot_agent"];
13
+ 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_push", "nomoreide_git_clone", "nomoreide_git_register_repository", "nomoreide_git_select_repository", "nomoreide_snapshots_list", "nomoreide_snapshot_create", "nomoreide_github_set_token", "nomoreide_github_list_prs", "nomoreide_github_get_pr", "nomoreide_github_get_pr_diff", "nomoreide_github_create_pr", "nomoreide_github_merge_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_db_query", "nomoreide_docs", "nomoreide_open_ui", "nomoreide_close_ui", "nomoreide_agents_status", "nomoreide_agents_read_configs", "nomoreide_agents_doctor", "nomoreide_agents_add_mcp", "nomoreide_agents_remove_mcp", "nomoreide_agents_move_mcp_scope", "nomoreide_agents_move_skill_scope", "nomoreide_agents_snapshot_agent", "nomoreide_profiles_list", "nomoreide_profiles_get", "nomoreide_profiles_create", "nomoreide_profiles_update", "nomoreide_profiles_delete", "nomoreide_profiles_snapshot", "nomoreide_profiles_apply", "nomoreide_profiles_export", "nomoreide_profiles_import", "nomoreide_profiles_copy_items"];
14
14
  interface RegisterNoMoreIdeToolsOptions extends ToolContext {
15
15
  server: FastMCP;
16
16
  toolCallStore?: ToolCallStore;
@@ -1,6 +1,7 @@
1
1
  import { wrapServerForRecording } from "./context.js";
2
2
  import { AGENT_TOOL_NAMES, registerAgentTools } from "./agent.js";
3
3
  import { AGENT_ENV_TOOL_NAMES, registerAgentEnvTools } from "./agent-env.js";
4
+ import { AGENT_PROFILE_TOOL_NAMES, registerAgentProfileTools } from "./agent-profiles.js";
4
5
  import { DATABASE_TOOL_NAMES, registerDatabaseTools } from "./database.js";
5
6
  import { DOC_TOOL_NAMES, registerDocTools } from "./docs.js";
6
7
  import { ERROR_TOOL_NAMES, registerErrorTools } from "./errors.js";
@@ -28,6 +29,7 @@ export const NOMOREIDE_TOOL_NAMES = [
28
29
  ...DOC_TOOL_NAMES,
29
30
  ...AGENT_TOOL_NAMES,
30
31
  ...AGENT_ENV_TOOL_NAMES,
32
+ ...AGENT_PROFILE_TOOL_NAMES,
31
33
  ];
32
34
  export function registerNoMoreIdeTools(options) {
33
35
  const { server: rawServer, toolCallStore, agentSessions, ...ctx } = options;
@@ -44,5 +46,6 @@ export function registerNoMoreIdeTools(options) {
44
46
  registerDocTools(server, ctx);
45
47
  registerAgentTools(server, ctx);
46
48
  registerAgentEnvTools(server, ctx);
49
+ registerAgentProfileTools(server, ctx);
47
50
  }
48
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,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;AACzE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,mBAAmB;IACtB,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,oBAAoB;CACf,CAAC;AAQX,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;QACjE,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,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,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;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp/tools/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,sBAAsB,EAAoB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC1F,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;AACzE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE5E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,GAAG,kBAAkB;IACrB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,mBAAmB;IACtB,GAAG,iBAAiB;IACpB,GAAG,gBAAgB;IACnB,GAAG,mBAAmB;IACtB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,oBAAoB;IACvB,GAAG,wBAAwB;CACnB,CAAC;AAQX,MAAM,UAAU,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC;IAC5E,MAAM,MAAM,GAAG,aAAa;QAC1B,CAAC,CAAC,sBAAsB,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;QACjE,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,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,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;IAChC,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC"}