nomoreide 0.1.71 → 0.1.73

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 (41) hide show
  1. package/README.md +48 -0
  2. package/dist/cli/agents.d.ts +2 -0
  3. package/dist/cli/agents.js +43 -0
  4. package/dist/cli/agents.js.map +1 -0
  5. package/dist/cli/commands.js +9 -1
  6. package/dist/cli/commands.js.map +1 -1
  7. package/dist/cli/profile.d.ts +2 -0
  8. package/dist/cli/profile.js +167 -0
  9. package/dist/cli/profile.js.map +1 -0
  10. package/dist/core/agent-profiles/index.d.ts +4 -0
  11. package/dist/core/agent-profiles/index.js +4 -0
  12. package/dist/core/agent-profiles/index.js.map +1 -1
  13. package/dist/core/agent-profiles/registry-auth.d.ts +25 -0
  14. package/dist/core/agent-profiles/registry-auth.js +78 -0
  15. package/dist/core/agent-profiles/registry-auth.js.map +1 -0
  16. package/dist/core/agent-profiles/registry-client.d.ts +65 -0
  17. package/dist/core/agent-profiles/registry-client.js +97 -0
  18. package/dist/core/agent-profiles/registry-client.js.map +1 -0
  19. package/dist/core/agent-profiles/registry-config.d.ts +48 -0
  20. package/dist/core/agent-profiles/registry-config.js +164 -0
  21. package/dist/core/agent-profiles/registry-config.js.map +1 -0
  22. package/dist/core/agent-profiles/registry-transfer.d.ts +42 -0
  23. package/dist/core/agent-profiles/registry-transfer.js +102 -0
  24. package/dist/core/agent-profiles/registry-transfer.js.map +1 -0
  25. package/dist/index.js +13 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/mcp/tools/agent-registry.d.ts +9 -0
  28. package/dist/mcp/tools/agent-registry.js +81 -0
  29. package/dist/mcp/tools/agent-registry.js.map +1 -0
  30. package/dist/mcp/tools/index.d.ts +1 -1
  31. package/dist/mcp/tools/index.js +3 -0
  32. package/dist/mcp/tools/index.js.map +1 -1
  33. package/dist/web/client/assets/{code-editor-B0j6kcLb.js → code-editor-DetFymBD.js} +1 -1
  34. package/dist/web/client/assets/{index-DAiSqTLR.js → index-ZEkxfpgl.js} +116 -116
  35. package/dist/web/client/index.html +1 -1
  36. package/dist/web/routes/agent-registry-routes.d.ts +2 -0
  37. package/dist/web/routes/agent-registry-routes.js +295 -0
  38. package/dist/web/routes/agent-registry-routes.js.map +1 -0
  39. package/dist/web/routes/index.js +4 -0
  40. package/dist/web/routes/index.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ /**
2
+ * HTTP client for the hosted profile registry (the brainctl platform).
3
+ * Thin wrapper over its REST API: profile CRUD, version + package upload,
4
+ * publish, install descriptors, and GitHub-repo registration. Auth is the
5
+ * caller's job — pass a token or an already-authenticated `fetch`.
6
+ */
7
+ export function createRegistryClient(options) {
8
+ const fetchImpl = options.fetch ?? fetch;
9
+ const baseUrl = options.baseUrl.replace(/\/$/, "");
10
+ const authHeaders = options.token
11
+ ? { authorization: `Bearer ${options.token}` }
12
+ : {};
13
+ const jsonHeaders = { "content-type": "application/json", ...authHeaders };
14
+ async function failIfNotOk(response, action) {
15
+ if (response.ok)
16
+ return;
17
+ const text = await response.text().catch(() => "");
18
+ throw new Error(`${action} failed: HTTP ${response.status}${text ? ` — ${text}` : ""}`);
19
+ }
20
+ return {
21
+ async getProfileBySlug(slug) {
22
+ const response = await fetchImpl(`${baseUrl}/profiles/${slug}`, {
23
+ headers: authHeaders,
24
+ });
25
+ if (response.status === 404)
26
+ return null;
27
+ await failIfNotOk(response, "Lookup profile");
28
+ return (await response.json());
29
+ },
30
+ async createProfile(input) {
31
+ const response = await fetchImpl(`${baseUrl}/profiles`, {
32
+ method: "POST",
33
+ headers: jsonHeaders,
34
+ body: JSON.stringify({
35
+ slug: input.slug,
36
+ title: input.title,
37
+ summary: input.summary ?? "",
38
+ visibility: input.visibility ?? "public",
39
+ }),
40
+ });
41
+ await failIfNotOk(response, "Create profile");
42
+ return (await response.json());
43
+ },
44
+ async createProfileVersion(input) {
45
+ const response = await fetchImpl(`${baseUrl}/profiles/${input.profileId}/versions`, {
46
+ method: "POST",
47
+ headers: jsonHeaders,
48
+ body: JSON.stringify({
49
+ version: input.version,
50
+ changelog: input.changelog ?? "",
51
+ manifest_json: input.manifestJson,
52
+ }),
53
+ });
54
+ await failIfNotOk(response, "Create profile version");
55
+ return (await response.json());
56
+ },
57
+ async uploadPackage(input) {
58
+ const response = await fetchImpl(`${baseUrl}/profiles/${input.profileId}/versions/${input.versionId}/package`, {
59
+ method: "POST",
60
+ headers: { "content-type": input.mimeType ?? "application/gzip", ...authHeaders },
61
+ body: input.bytes,
62
+ });
63
+ await failIfNotOk(response, "Upload package");
64
+ return response.json();
65
+ },
66
+ async publishProfileVersion(input) {
67
+ const response = await fetchImpl(`${baseUrl}/profiles/${input.profileId}/versions/${input.versionId}/publish`, { method: "POST", headers: authHeaders });
68
+ await failIfNotOk(response, "Publish profile version");
69
+ return response.json();
70
+ },
71
+ async getInstallDescriptor(slug) {
72
+ const response = await fetchImpl(`${baseUrl}/profiles/${slug}/install`, {
73
+ headers: authHeaders,
74
+ });
75
+ await failIfNotOk(response, "Read install descriptor");
76
+ return (await response.json());
77
+ },
78
+ async registerGithubProfile(input) {
79
+ const response = await fetchImpl(`${baseUrl}/profiles/github/register`, {
80
+ method: "POST",
81
+ headers: jsonHeaders,
82
+ body: JSON.stringify({
83
+ repo_url: input.repoUrl,
84
+ slug: input.slug,
85
+ title: input.title,
86
+ summary: input.summary ?? "",
87
+ ref_name: input.refName ?? "main",
88
+ profile_path: input.profilePath ?? "profile.yaml",
89
+ manifest_json: input.manifestJson,
90
+ }),
91
+ });
92
+ await failIfNotOk(response, "Register GitHub profile");
93
+ return response.json();
94
+ },
95
+ };
96
+ }
97
+ //# sourceMappingURL=registry-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/registry-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare const DEFAULT_REGISTRY_API_BASE_URL = "https://api.brainctl.net";
2
+ export declare const DEFAULT_REGISTRY_FRONTEND_URL = "https://app.brainctl.net";
3
+ export type RegistryConfigKey = "apiBaseUrl" | "apiToken" | "apiRefreshToken" | "apiFrontendUrl";
4
+ export interface RegistryConfig {
5
+ apiBaseUrl?: string;
6
+ apiToken?: string;
7
+ apiRefreshToken?: string;
8
+ apiFrontendUrl?: string;
9
+ }
10
+ export type RegistryApiTargetSource = "env" | "config" | "default";
11
+ export type RegistryApiTargetMode = "local" | "prod" | "custom";
12
+ export interface RegistryApiTarget {
13
+ apiBaseUrl: string;
14
+ source: RegistryApiTargetSource;
15
+ mode: RegistryApiTargetMode;
16
+ }
17
+ export interface RegistryConfigOptions {
18
+ /** Injectable for tmpdir tests. */
19
+ configPath?: string;
20
+ env?: NodeJS.ProcessEnv;
21
+ }
22
+ export interface RegistryConfigService {
23
+ path(): string;
24
+ get(key: RegistryConfigKey): Promise<string | undefined>;
25
+ set(key: RegistryConfigKey, value: string): Promise<void>;
26
+ unset(key: RegistryConfigKey): Promise<void>;
27
+ }
28
+ export declare function registryConfigPath(options?: RegistryConfigOptions): string;
29
+ export declare function createRegistryConfigService(options?: RegistryConfigOptions): RegistryConfigService;
30
+ export declare function resolveRegistryApiTarget(options?: RegistryConfigOptions & {
31
+ configService?: RegistryConfigService;
32
+ }): Promise<RegistryApiTarget>;
33
+ export declare function resolveRegistryApiBaseUrl(options?: RegistryConfigOptions & {
34
+ apiBaseUrl?: string;
35
+ configService?: RegistryConfigService;
36
+ }): Promise<string>;
37
+ export type RegistryTokenSource = "env" | "config";
38
+ export declare function resolveRegistryApiToken(options?: RegistryConfigOptions & {
39
+ configService?: RegistryConfigService;
40
+ }): Promise<{
41
+ token: string;
42
+ source: RegistryTokenSource;
43
+ } | null>;
44
+ /** Registry web UI base — where the browser sign-in flow lives. */
45
+ export declare function resolveRegistryFrontendUrl(options?: RegistryConfigOptions & {
46
+ apiBaseUrl?: string;
47
+ configService?: RegistryConfigService;
48
+ }): Promise<string>;
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Profile registry configuration (ROR-63). The hosted registry is the
3
+ * brainctl platform (kept as-is per the ROR-63 decision), so credentials and
4
+ * target URLs live in brainctl's config file at `~/.brainctl/config.json` and
5
+ * honor the `BRAINCTL_*` environment variables — existing brainctl sign-ins
6
+ * keep working unchanged.
7
+ */
8
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
9
+ import { homedir } from "node:os";
10
+ import path from "node:path";
11
+ export const DEFAULT_REGISTRY_API_BASE_URL = "https://api.brainctl.net";
12
+ export const DEFAULT_REGISTRY_FRONTEND_URL = "https://app.brainctl.net";
13
+ export function registryConfigPath(options = {}) {
14
+ const env = options.env ?? process.env;
15
+ return (options.configPath ??
16
+ env.BRAINCTL_CONFIG_PATH ??
17
+ path.join(env.BRAINCTL_HOME ?? homedir(), ".brainctl", "config.json"));
18
+ }
19
+ export function createRegistryConfigService(options = {}) {
20
+ const filePath = registryConfigPath(options);
21
+ async function read() {
22
+ let source;
23
+ try {
24
+ source = await readFile(filePath, "utf8");
25
+ }
26
+ catch {
27
+ return {};
28
+ }
29
+ try {
30
+ return normalizeConfig(JSON.parse(source));
31
+ }
32
+ catch (error) {
33
+ throw new Error(`Invalid registry config at ${filePath}: ${error.message}`);
34
+ }
35
+ }
36
+ async function write(config) {
37
+ await mkdir(path.dirname(filePath), { recursive: true });
38
+ await writeFile(filePath, `${JSON.stringify(config, null, 2)}\n`, "utf8");
39
+ }
40
+ return {
41
+ path: () => filePath,
42
+ async get(key) {
43
+ return (await read())[key];
44
+ },
45
+ async set(key, value) {
46
+ const config = await read();
47
+ await write({ ...config, [key]: normalizeConfigValue(key, value) });
48
+ },
49
+ async unset(key) {
50
+ const config = await read();
51
+ delete config[key];
52
+ await write(config);
53
+ },
54
+ };
55
+ }
56
+ export async function resolveRegistryApiTarget(options = {}) {
57
+ const env = options.env ?? process.env;
58
+ const envValue = env.BRAINCTL_API_BASE_URL ?? env.BRAINCTL_API_URL;
59
+ if (envValue)
60
+ return toApiTarget(normalizeBaseUrl(envValue), "env");
61
+ const configService = options.configService ?? createRegistryConfigService(options);
62
+ const configured = await configService.get("apiBaseUrl");
63
+ if (configured)
64
+ return toApiTarget(normalizeBaseUrl(configured), "config");
65
+ return toApiTarget(DEFAULT_REGISTRY_API_BASE_URL, "default");
66
+ }
67
+ export async function resolveRegistryApiBaseUrl(options = {}) {
68
+ if (options.apiBaseUrl)
69
+ return normalizeBaseUrl(options.apiBaseUrl);
70
+ return (await resolveRegistryApiTarget(options)).apiBaseUrl;
71
+ }
72
+ export async function resolveRegistryApiToken(options = {}) {
73
+ const env = options.env ?? process.env;
74
+ if (env.BRAINCTL_API_TOKEN?.trim()) {
75
+ return { token: env.BRAINCTL_API_TOKEN.trim(), source: "env" };
76
+ }
77
+ const configService = options.configService ?? createRegistryConfigService(options);
78
+ const stored = await configService.get("apiToken");
79
+ if (stored?.trim())
80
+ return { token: stored.trim(), source: "config" };
81
+ return null;
82
+ }
83
+ /** Registry web UI base — where the browser sign-in flow lives. */
84
+ export async function resolveRegistryFrontendUrl(options = {}) {
85
+ const env = options.env ?? process.env;
86
+ if (env.BRAINCTL_FRONTEND_URL?.trim()) {
87
+ return normalizeBaseUrl(env.BRAINCTL_FRONTEND_URL);
88
+ }
89
+ const configService = options.configService ?? createRegistryConfigService(options);
90
+ const stored = await configService.get("apiFrontendUrl");
91
+ if (stored)
92
+ return normalizeBaseUrl(stored);
93
+ if (options.apiBaseUrl) {
94
+ try {
95
+ const url = new URL(options.apiBaseUrl);
96
+ if (url.hostname === "localhost" || url.hostname === "127.0.0.1") {
97
+ return `${url.protocol}//${url.hostname}:5173`;
98
+ }
99
+ if (url.hostname.startsWith("api.")) {
100
+ return `${url.protocol}//app.${url.hostname.slice("api.".length)}`;
101
+ }
102
+ }
103
+ catch {
104
+ // fall through to default
105
+ }
106
+ }
107
+ return DEFAULT_REGISTRY_FRONTEND_URL;
108
+ }
109
+ function normalizeConfig(value) {
110
+ if (!value || typeof value !== "object")
111
+ return {};
112
+ const config = {};
113
+ if (typeof value.apiBaseUrl === "string" && value.apiBaseUrl.trim()) {
114
+ config.apiBaseUrl = normalizeBaseUrl(value.apiBaseUrl);
115
+ }
116
+ if (typeof value.apiFrontendUrl === "string" && value.apiFrontendUrl.trim()) {
117
+ config.apiFrontendUrl = normalizeBaseUrl(value.apiFrontendUrl);
118
+ }
119
+ if (typeof value.apiToken === "string" && value.apiToken.trim()) {
120
+ config.apiToken = value.apiToken.trim();
121
+ }
122
+ if (typeof value.apiRefreshToken === "string" && value.apiRefreshToken.trim()) {
123
+ config.apiRefreshToken = value.apiRefreshToken.trim();
124
+ }
125
+ return config;
126
+ }
127
+ function normalizeConfigValue(key, value) {
128
+ if (key === "apiBaseUrl" || key === "apiFrontendUrl")
129
+ return normalizeBaseUrl(value);
130
+ const trimmed = value.trim();
131
+ if (!trimmed)
132
+ throw new Error(`${key} cannot be empty.`);
133
+ return trimmed;
134
+ }
135
+ function normalizeBaseUrl(value) {
136
+ const trimmed = value.trim().replace(/\/+$/, "");
137
+ if (!trimmed)
138
+ throw new Error("Registry URL cannot be empty.");
139
+ let parsed;
140
+ try {
141
+ parsed = new URL(trimmed);
142
+ }
143
+ catch {
144
+ throw new Error(`Invalid registry URL "${value}". Use an http:// or https:// URL.`);
145
+ }
146
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
147
+ throw new Error(`Invalid registry URL "${value}". Use an http:// or https:// URL.`);
148
+ }
149
+ return trimmed;
150
+ }
151
+ function toApiTarget(apiBaseUrl, source) {
152
+ let mode = "custom";
153
+ if (apiBaseUrl === DEFAULT_REGISTRY_API_BASE_URL) {
154
+ mode = "prod";
155
+ }
156
+ else {
157
+ const { hostname } = new URL(apiBaseUrl);
158
+ if (hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1") {
159
+ mode = "local";
160
+ }
161
+ }
162
+ return { apiBaseUrl, source, mode };
163
+ }
164
+ //# sourceMappingURL=registry-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-config.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/registry-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type RegistryClient } from "./registry-client.js";
2
+ import { type ProfileStoreOptions } from "./store.js";
3
+ import { type ImportResult } from "./transfer.js";
4
+ export interface PublishProfileInput {
5
+ name: string;
6
+ slug: string;
7
+ title: string;
8
+ summary?: string;
9
+ version?: string;
10
+ changelog?: string;
11
+ visibility?: "public" | "private";
12
+ cwd: string;
13
+ /** Registry API base; the caller resolves it (config/env/default). */
14
+ apiBaseUrl: string;
15
+ /** Pass an authenticated fetch (token manager) or a raw token. */
16
+ token?: string;
17
+ fetch?: typeof fetch;
18
+ }
19
+ export interface PublishProfileResult {
20
+ slug: string;
21
+ profileId: string;
22
+ versionId: string;
23
+ version: string;
24
+ }
25
+ export declare function publishProfileToRegistry(input: PublishProfileInput, options?: ProfileStoreOptions): Promise<PublishProfileResult>;
26
+ export interface InstallFromRegistryInput {
27
+ slug: string;
28
+ apiBaseUrl: string;
29
+ token?: string;
30
+ force?: boolean;
31
+ /** Import under a different local profile name. */
32
+ as?: string;
33
+ credentials?: Record<string, string>;
34
+ fetch?: typeof fetch;
35
+ /** Injectable for tests. */
36
+ client?: RegistryClient;
37
+ }
38
+ export interface InstallFromRegistryResult extends ImportResult {
39
+ version: string;
40
+ sourceKind: string;
41
+ }
42
+ export declare function installProfileFromRegistry(input: InstallFromRegistryInput, options?: ProfileStoreOptions): Promise<InstallFromRegistryResult>;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Publish / install flows between local profiles and the hosted registry.
3
+ * Publish reuses `exportProfile`, so the uploaded package is the same
4
+ * credential-redacted `.tar.gz` a local export produces — raw secrets never
5
+ * leave the machine. Install downloads a published package and runs it
6
+ * through `importProfile` (same validation and credential resolution).
7
+ */
8
+ import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
9
+ import { tmpdir } from "node:os";
10
+ import path from "node:path";
11
+ import { createRegistryClient } from "./registry-client.js";
12
+ import { getProfile } from "./store.js";
13
+ import { exportProfile, importProfile } from "./transfer.js";
14
+ export async function publishProfileToRegistry(input, options = {}) {
15
+ const version = input.version ?? "1.0.0";
16
+ const client = createRegistryClient({
17
+ baseUrl: input.apiBaseUrl,
18
+ token: input.token,
19
+ fetch: input.fetch,
20
+ });
21
+ const profile = await getProfile(input.name, options);
22
+ const tmpRoot = await mkdtemp(path.join(tmpdir(), "nomoreide-publish-"));
23
+ try {
24
+ const { archivePath } = await exportProfile({ name: input.name, outputPath: path.join(tmpRoot, `${input.name}.tar.gz`), cwd: input.cwd }, options);
25
+ const bytes = await readFile(archivePath);
26
+ let registryProfile = await client.getProfileBySlug(input.slug);
27
+ if (!registryProfile) {
28
+ registryProfile = await client.createProfile({
29
+ slug: input.slug,
30
+ title: input.title,
31
+ summary: input.summary,
32
+ visibility: input.visibility,
33
+ });
34
+ }
35
+ const registryVersion = await client.createProfileVersion({
36
+ profileId: registryProfile.id,
37
+ version,
38
+ changelog: input.changelog,
39
+ manifestJson: {
40
+ name: input.slug,
41
+ version,
42
+ ...(profile.description ? { description: profile.description } : {}),
43
+ mcps: Object.entries(profile.mcps).map(([name, entry]) => ({ name, kind: entry.kind })),
44
+ skills: profile.skills.map((skill) => ({ name: skill.name })),
45
+ plugins: [],
46
+ },
47
+ });
48
+ await client.uploadPackage({
49
+ profileId: registryProfile.id,
50
+ versionId: registryVersion.id,
51
+ bytes,
52
+ mimeType: "application/gzip",
53
+ });
54
+ await client.publishProfileVersion({
55
+ profileId: registryProfile.id,
56
+ versionId: registryVersion.id,
57
+ });
58
+ return {
59
+ slug: input.slug,
60
+ profileId: registryProfile.id,
61
+ versionId: registryVersion.id,
62
+ version,
63
+ };
64
+ }
65
+ finally {
66
+ await rm(tmpRoot, { recursive: true, force: true });
67
+ }
68
+ }
69
+ export async function installProfileFromRegistry(input, options = {}) {
70
+ const slug = input.slug.trim();
71
+ if (!slug)
72
+ throw new Error("Registry slug is required.");
73
+ const fetchImpl = input.fetch ?? fetch;
74
+ const client = input.client ??
75
+ createRegistryClient({ baseUrl: input.apiBaseUrl, token: input.token, fetch: fetchImpl });
76
+ const descriptor = await client.getInstallDescriptor(slug);
77
+ if (!descriptor.download_url) {
78
+ throw new Error(`Registry profile "${slug}" has no downloadable package.`);
79
+ }
80
+ const response = await fetchImpl(descriptor.download_url);
81
+ if (!response.ok) {
82
+ const text = await response.text().catch(() => "");
83
+ throw new Error(`Download failed: HTTP ${response.status}${text ? ` — ${text}` : ""}`);
84
+ }
85
+ const bytes = new Uint8Array(await response.arrayBuffer());
86
+ const dir = await mkdtemp(path.join(tmpdir(), "nomoreide-registry-install-"));
87
+ try {
88
+ const archivePath = path.join(dir, `${slug}-${descriptor.version}.tar.gz`);
89
+ await writeFile(archivePath, bytes);
90
+ const result = await importProfile({
91
+ archivePath,
92
+ force: input.force,
93
+ as: input.as,
94
+ credentials: input.credentials,
95
+ }, options);
96
+ return { ...result, version: descriptor.version, sourceKind: descriptor.source_kind };
97
+ }
98
+ finally {
99
+ await rm(dir, { recursive: true, force: true }).catch(() => { });
100
+ }
101
+ }
102
+ //# sourceMappingURL=registry-transfer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-transfer.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/registry-transfer.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,11 +16,22 @@ else if (command === "web") {
16
16
  const server = await createWebServer({ port }).start();
17
17
  console.error(`NoMoreIDE web UI: ${server.url}`);
18
18
  }
19
- else if (["add", "git", "list", "logs", "setup", "start", "stop", "restart"].includes(command)) {
19
+ else if ([
20
+ "add",
21
+ "agents",
22
+ "git",
23
+ "list",
24
+ "logs",
25
+ "profile",
26
+ "setup",
27
+ "start",
28
+ "stop",
29
+ "restart",
30
+ ].includes(command)) {
20
31
  process.exitCode = await runCli(process.argv.slice(2));
21
32
  }
22
33
  else {
23
- console.error("Usage: nomoreide [mcp|setup|tui|web|git|list|logs|start|stop|restart|add]");
34
+ console.error("Usage: nomoreide [mcp|setup|tui|web|git|agents|profile|list|logs|start|stop|restart|add]");
24
35
  process.exitCode = 1;
25
36
  }
26
37
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAEzC,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,uBAAuB,EAAE,CAAC;AAClC,CAAC;KAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;IAC7B,MAAM,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC;KAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,CAAC;KAAM,IACL,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,QAAQ,CAC1E,OAAO,CACR,EACD,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CACX,2EAA2E,CAC5E,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;AAEzC,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,uBAAuB,EAAE,CAAC;AAClC,CAAC;KAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;IAC7B,MAAM,YAAY,EAAE,CAAC,KAAK,EAAE,CAAC;AAC/B,CAAC;KAAM,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACvD,OAAO,CAAC,KAAK,CAAC,qBAAqB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACnD,CAAC;KAAM,IACL;IACE,KAAK;IACL,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,OAAO;IACP,OAAO;IACP,MAAM;IACN,SAAS;CACV,CAAC,QAAQ,CAAC,OAAO,CAAC,EACnB,CAAC;IACD,OAAO,CAAC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CACX,0FAA0F,CAC3F,CAAC;IACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FastMCP } from "fastmcp";
2
+ import { type ToolContext } from "./context.js";
3
+ export declare const AGENT_REGISTRY_TOOL_NAMES: readonly ["nomoreide_profiles_publish", "nomoreide_profiles_install_from_registry", "nomoreide_profiles_register_github"];
4
+ /**
5
+ * Hosted profile registry (ROR-63; the brainctl platform, kept as-is).
6
+ * Auth comes from the stored registry sign-in (`~/.brainctl/config.json`) or
7
+ * `BRAINCTL_API_TOKEN` — sign-in itself is a browser flow in the web UI.
8
+ */
9
+ export declare function registerAgentRegistryTools(server: FastMCP, _ctx: ToolContext): void;
@@ -0,0 +1,81 @@
1
+ import { z } from "zod";
2
+ import { createRegistryClient, createRegistryTokenManager, installProfileFromRegistry, publishProfileToRegistry, resolveRegistryApiBaseUrl, resolveRegistryApiToken, } from "../../core/agent-profiles/index.js";
3
+ import { stringify } from "./context.js";
4
+ export const AGENT_REGISTRY_TOOL_NAMES = [
5
+ "nomoreide_profiles_publish",
6
+ "nomoreide_profiles_install_from_registry",
7
+ "nomoreide_profiles_register_github",
8
+ ];
9
+ /**
10
+ * Hosted profile registry (ROR-63; the brainctl platform, kept as-is).
11
+ * Auth comes from the stored registry sign-in (`~/.brainctl/config.json`) or
12
+ * `BRAINCTL_API_TOKEN` — sign-in itself is a browser flow in the web UI.
13
+ */
14
+ export function registerAgentRegistryTools(server, _ctx) {
15
+ const tokenManager = createRegistryTokenManager();
16
+ const authenticatedFetch = (input, init) => tokenManager.authenticatedFetch(typeof input === "string" ? input : input.toString(), init);
17
+ async function requireToken() {
18
+ if ((await tokenManager.getAccessToken()) === null) {
19
+ throw new Error("Not signed in to the profile registry. Sign in from the web UI (Agent Environments → Registry) or set BRAINCTL_API_TOKEN.");
20
+ }
21
+ }
22
+ server.addTool({
23
+ name: "nomoreide_profiles_publish",
24
+ description: "Publish a saved profile to the hosted registry so others can install it by slug. Uploads the credential-redacted export archive — raw secrets never leave the machine.",
25
+ parameters: z.object({
26
+ name: z.string().min(1).describe("Local profile name."),
27
+ slug: z.string().min(1).describe("Registry slug to publish under."),
28
+ title: z.string().min(1),
29
+ summary: z.string().optional(),
30
+ version: z.string().optional().describe("Defaults to 1.0.0."),
31
+ changelog: z.string().optional(),
32
+ visibility: z.enum(["public", "private"]).default("public"),
33
+ cwd: z.string().min(1).optional().describe("Project directory (defaults to the server's cwd)."),
34
+ }),
35
+ execute: async (input) => {
36
+ await requireToken();
37
+ return stringify(await publishProfileToRegistry({
38
+ ...input,
39
+ cwd: input.cwd ?? process.cwd(),
40
+ apiBaseUrl: await resolveRegistryApiBaseUrl(),
41
+ fetch: authenticatedFetch,
42
+ }));
43
+ },
44
+ });
45
+ server.addTool({
46
+ name: "nomoreide_profiles_install_from_registry",
47
+ description: "Install a published profile from the hosted registry by slug. Supplied credentials (or matching environment variables) fill ${credentials.*} placeholders; unresolved keys are reported.",
48
+ parameters: z.object({
49
+ slug: z.string().min(1),
50
+ force: z.boolean().default(false).describe("Overwrite an existing profile of the same name."),
51
+ as: z.string().optional().describe("Install under a different local profile name."),
52
+ credentials: z.record(z.string()).optional(),
53
+ }),
54
+ execute: async (input) => stringify(await installProfileFromRegistry({
55
+ ...input,
56
+ apiBaseUrl: await resolveRegistryApiBaseUrl(),
57
+ token: (await resolveRegistryApiToken())?.token,
58
+ })),
59
+ });
60
+ server.addTool({
61
+ name: "nomoreide_profiles_register_github",
62
+ description: "Register a GitHub repository as a registry profile — the registry serves it without a package upload (free sharing path).",
63
+ parameters: z.object({
64
+ repoUrl: z.string().min(1).describe("GitHub repository URL."),
65
+ slug: z.string().min(1),
66
+ title: z.string().min(1),
67
+ summary: z.string().optional(),
68
+ refName: z.string().optional().describe("Branch or tag (defaults to main)."),
69
+ profilePath: z.string().optional().describe("Path to the profile file inside the repo."),
70
+ }),
71
+ execute: async (input) => {
72
+ await requireToken();
73
+ const client = createRegistryClient({
74
+ baseUrl: await resolveRegistryApiBaseUrl(),
75
+ fetch: authenticatedFetch,
76
+ });
77
+ return stringify(await client.registerGithubProfile({ ...input, manifestJson: { name: input.slug } }));
78
+ },
79
+ });
80
+ }
81
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../../src/mcp/tools/agent-registry.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", "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"];
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", "nomoreide_profiles_publish", "nomoreide_profiles_install_from_registry", "nomoreide_profiles_register_github"];
14
14
  interface RegisterNoMoreIdeToolsOptions extends ToolContext {
15
15
  server: FastMCP;
16
16
  toolCallStore?: ToolCallStore;