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
package/README.md CHANGED
@@ -212,6 +212,9 @@ graph TD
212
212
  | Database browse and SQL query | | | ✓ | ✓ |
213
213
  | Human-approved SQL writes | | | ✓ | |
214
214
  | Agent tools, hooks, plugins, usage | | | ✓ | |
215
+ | Agent environments (live MCPs & skills) | ✓ | | ✓ | ✓ |
216
+ | Agent profiles (snapshot / apply / share) | ✓ | | ✓ | ✓ |
217
+ | Hosted profile registry (publish / install) | ✓ | | ✓ | ✓ |
215
218
  | Safe Git (no force-push, no reset) | ✓ | ✓ | ✓ | ✓ |
216
219
 
217
220
  ---
@@ -316,6 +319,36 @@ nomoreide git add-repo app --path /path/to/repo
316
319
  nomoreide git select-repo app
317
320
  ```
318
321
 
322
+ ### Agent Environments & Profiles
323
+
324
+ Inspect and manage your coding agents' MCP servers and skills (Claude Code,
325
+ Codex CLI, Antigravity), and bundle them into portable profiles. Formerly the
326
+ standalone `brainctl` package — see the
327
+ [migration guide](docs/brainctl-migration.md).
328
+
329
+ ```bash
330
+ # Live agent configuration (read-only)
331
+ nomoreide agents status # per-agent install state, MCP + skill counts
332
+ nomoreide agents doctor # config sanity checks
333
+ nomoreide agents read claude # dump one agent's live config as JSON
334
+
335
+ # Profiles: named bundles of MCP servers + skills
336
+ nomoreide profile list
337
+ nomoreide profile snapshot claude my-setup # capture an agent's live config
338
+ nomoreide profile apply my-setup codex --dry-run
339
+ nomoreide profile apply my-setup codex # backs up the config first
340
+ nomoreide profile export my-setup # credential-redacted .tar.gz
341
+ nomoreide profile import my-setup.tar.gz --as teammate-setup
342
+
343
+ # Hosted registry (sign in via the web UI, or set BRAINCTL_API_TOKEN)
344
+ nomoreide profile publish my-setup --slug my-setup --title "My Setup"
345
+ nomoreide profile install my-setup
346
+ ```
347
+
348
+ Exports and published packages never contain raw secrets — secret-looking
349
+ values are redacted to `${credentials.*}` placeholders that importers fill
350
+ from their own environment.
351
+
319
352
  ---
320
353
 
321
354
  ## MCP Tools
@@ -383,6 +416,21 @@ All tools are prefixed with `nomoreide_` and are available to any connected MCP
383
416
  | `nomoreide_github_get_commit_ci` | Inspect commit check status |
384
417
  | `nomoreide_github_list_workflow_runs` | List recent GitHub Actions workflow runs |
385
418
 
419
+ ### Agent Environment & Profile Tools
420
+
421
+ | Tool | Description |
422
+ |---|---|
423
+ | `nomoreide_agents_status` / `nomoreide_agents_read_configs` | Live agent install state and MCP/skill configuration |
424
+ | `nomoreide_agents_doctor` | Agent config sanity checks |
425
+ | `nomoreide_agents_add_mcp` / `nomoreide_agents_remove_mcp` | Add or remove an MCP server (config backed up first) |
426
+ | `nomoreide_agents_move_mcp_scope` / `nomoreide_agents_move_skill_scope` | Copy/move MCPs and skills between agents and scopes |
427
+ | `nomoreide_agents_snapshot_agent` | Back up an agent's config files |
428
+ | `nomoreide_profiles_list` / `get` / `create` / `update` / `delete` | Profile CRUD |
429
+ | `nomoreide_profiles_snapshot` / `nomoreide_profiles_apply` | Capture a live agent into a profile / apply one (dry-run preview) |
430
+ | `nomoreide_profiles_export` / `nomoreide_profiles_import` | Credential-redacted portable archives |
431
+ | `nomoreide_profiles_publish` / `nomoreide_profiles_install_from_registry` | Share profiles through the hosted registry |
432
+ | `nomoreide_profiles_register_github` | Register a GitHub repo as a registry profile |
433
+
386
434
  ---
387
435
 
388
436
  ## Example Configurations
@@ -0,0 +1,2 @@
1
+ /** Agent Environments on the CLI (ROR-64) — read-only, same core as UI/MCP. */
2
+ export declare function runAgentsCli(subcommand: string | undefined, args: string[], stdout: (line: string) => void): Promise<number>;
@@ -0,0 +1,43 @@
1
+ import { getAgentAvailability, readAllAgentConfigs, runAgentDoctor, AGENT_NAMES, } from "../core/agent-env/index.js";
2
+ import { UsageError } from "./errors.js";
3
+ const USAGE = "Usage: nomoreide agents [status|doctor|read [claude|codex|antigravity]]";
4
+ /** Agent Environments on the CLI (ROR-64) — read-only, same core as UI/MCP. */
5
+ export async function runAgentsCli(subcommand, args, stdout) {
6
+ const cwd = process.cwd();
7
+ if (subcommand === undefined || subcommand === "status") {
8
+ const [availability, configs] = await Promise.all([
9
+ getAgentAvailability(),
10
+ readAllAgentConfigs({ cwd }),
11
+ ]);
12
+ const byAgent = new Map(availability.map((entry) => [entry.agent, entry]));
13
+ stdout("Agent\tInstalled\tMCPs\tSkills\tConfig");
14
+ for (const config of configs) {
15
+ const installed = byAgent.get(config.agent)?.available ? "yes" : "no";
16
+ const mcpCount = Object.keys(config.mcpServers).length +
17
+ Object.keys(config.remoteMcpServers).length +
18
+ Object.keys(config.projectMcpServers).length +
19
+ Object.keys(config.projectRemoteMcpServers).length;
20
+ stdout(`${config.agent}\t${installed}\t${mcpCount}\t${config.skills.length}\t${config.exists ? config.configPath : "(none)"}`);
21
+ }
22
+ return 0;
23
+ }
24
+ if (subcommand === "doctor") {
25
+ const result = await runAgentDoctor({ cwd });
26
+ for (const check of result.checks) {
27
+ stdout(`${check.status === "ok" ? "ok" : "warn"}\t${check.label}\t${check.message}`);
28
+ }
29
+ return result.hasIssues ? 1 : 0;
30
+ }
31
+ if (subcommand === "read") {
32
+ const agent = args.find((arg) => !arg.startsWith("--"));
33
+ if (agent && !AGENT_NAMES.includes(agent)) {
34
+ throw new UsageError(`Unknown agent "${agent}". Use one of: ${AGENT_NAMES.join(", ")}`);
35
+ }
36
+ const configs = await readAllAgentConfigs({ cwd });
37
+ const selected = agent ? configs.filter((config) => config.agent === agent) : configs;
38
+ stdout(JSON.stringify(agent ? selected[0] : selected, null, 2));
39
+ return 0;
40
+ }
41
+ throw new UsageError(USAGE);
42
+ }
43
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/cli/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,WAAW,GAEZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,KAAK,GAAG,yEAAyE,CAAC;AAExF,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAA8B,EAC9B,IAAc,EACd,MAA8B;IAE9B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,oBAAoB,EAAE;YACtB,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;SAC7B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,wCAAwC,CAAC,CAAC;QACjD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;YACtE,MAAM,QAAQ,GACZ,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM;gBACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,MAAM;gBAC3C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM;gBAC5C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC;YACrD,MAAM,CACJ,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,KAAK,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CACvH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAkB,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAAC,kBAAkB,KAAK,kBAAkB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC9B,CAAC"}
@@ -2,10 +2,12 @@ import { resolve } from "node:path";
2
2
  import { ConfigStore, ConfigValidationError, defaultGlobalConfigPath, } from "../core/config-store.js";
3
3
  import { LogStore } from "../core/log-store.js";
4
4
  import { ProcessManager } from "../core/process-manager.js";
5
+ import { runAgentsCli } from "./agents.js";
5
6
  import { UsageError } from "./errors.js";
6
7
  import { parseFlags } from "./flags.js";
7
8
  import { runGitCli } from "./git.js";
8
- const USAGE = "Usage: nomoreide [mcp|setup|tui|web|git|list|logs|start|stop|restart|add]";
9
+ import { runProfileCli } from "./profile.js";
10
+ const USAGE = "Usage: nomoreide [mcp|setup|tui|web|git|agents|profile|list|logs|start|stop|restart|add]";
9
11
  const MCP_SETUP_LINES = [
10
12
  "NoMoreIDE MCP setup",
11
13
  "",
@@ -44,6 +46,12 @@ export async function runCli(args, options = {}) {
44
46
  if (command === "git") {
45
47
  return await runGitCli(subcommand, rest, stdout, configStore);
46
48
  }
49
+ if (command === "agents") {
50
+ return await runAgentsCli(subcommand, rest, stdout);
51
+ }
52
+ if (command === "profile") {
53
+ return await runProfileCli(subcommand, rest, stdout);
54
+ }
47
55
  if (command === "add" && subcommand === "service") {
48
56
  const name = rest[0];
49
57
  const flags = parseFlags(rest.slice(1));
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ /** Agent profiles on the CLI (ROR-64) — same core as the UI and MCP tools. */
2
+ export declare function runProfileCli(subcommand: string | undefined, args: string[], stdout: (line: string) => void): Promise<number>;
@@ -0,0 +1,167 @@
1
+ import { applyProfile, createRegistryTokenManager, deleteProfile, exportProfile, getProfile, importProfile, installProfileFromRegistry, listProfiles, previewProfileApply, publishProfileToRegistry, resolveRegistryApiBaseUrl, resolveRegistryApiToken, snapshotProfileFromAgent, } from "../core/agent-profiles/index.js";
2
+ import { AGENT_NAMES } from "../core/agent-env/index.js";
3
+ import { UsageError } from "./errors.js";
4
+ import { parseFlags } from "./flags.js";
5
+ const USAGE = [
6
+ "Usage: nomoreide profile <subcommand>",
7
+ " list saved profiles",
8
+ " show <name> full profile JSON",
9
+ " snapshot <agent> <name> [--description <text>]",
10
+ " apply <name> <agent> [--dry-run] [--skip-mcps a,b] [--skip-skills x,y]",
11
+ " export <name> [--output <path>] credential-redacted .tar.gz",
12
+ " import <archive> [--force] [--as <name>]",
13
+ " delete <name>",
14
+ " publish <name> --slug <slug> --title <title> [--version <v>] [--summary <text>]",
15
+ " install <slug> [--force] [--as <name>] install from the hosted registry",
16
+ ].join("\n");
17
+ /** Agent profiles on the CLI (ROR-64) — same core as the UI and MCP tools. */
18
+ export async function runProfileCli(subcommand, args, stdout) {
19
+ const cwd = process.cwd();
20
+ const flags = parseFlags(args);
21
+ const positional = args.filter((arg, index) => {
22
+ if (arg.startsWith("--"))
23
+ return false;
24
+ const previous = args[index - 1];
25
+ return !(previous?.startsWith("--") && !previous.includes("="));
26
+ });
27
+ const has = (flag) => args.includes(flag);
28
+ if (subcommand === undefined || subcommand === "list") {
29
+ const profiles = await listProfiles();
30
+ if (profiles.length === 0) {
31
+ stdout("No profiles yet. Create one with: nomoreide profile snapshot <agent> <name>");
32
+ return 0;
33
+ }
34
+ stdout("Name\tMCPs\tSkills\tUpdated\tDescription");
35
+ for (const profile of profiles) {
36
+ stdout(`${profile.name}\t${profile.mcpCount}\t${profile.skillCount}\t${profile.updatedAt}\t${profile.description ?? ""}`);
37
+ }
38
+ return 0;
39
+ }
40
+ if (subcommand === "show") {
41
+ const name = requirePositional(positional[0], "profile name");
42
+ stdout(JSON.stringify(await getProfile(name), null, 2));
43
+ return 0;
44
+ }
45
+ if (subcommand === "snapshot") {
46
+ const agent = requireAgent(positional[0]);
47
+ const name = requirePositional(positional[1], "profile name");
48
+ const profile = await snapshotProfileFromAgent({
49
+ agent,
50
+ name,
51
+ description: flags.description,
52
+ cwd,
53
+ });
54
+ stdout(`Snapshotted ${agent} into "${profile.name}" (${Object.keys(profile.mcps).length} MCPs, ${profile.skills.length} skills)`);
55
+ return 0;
56
+ }
57
+ if (subcommand === "apply") {
58
+ const name = requirePositional(positional[0], "profile name");
59
+ const agent = requireAgent(positional[1]);
60
+ if (has("--dry-run")) {
61
+ const preview = await previewProfileApply({ cwd, name, agent });
62
+ stdout("Item\tStatus");
63
+ for (const item of preview.items) {
64
+ const warnings = item.warnings.length > 0 ? ` (${item.warnings.join("; ")})` : "";
65
+ stdout(`${item.category} ${item.name}\t${item.status}${warnings}`);
66
+ }
67
+ if (preview.unresolvedCredentials.length > 0) {
68
+ stdout(`Unresolved credentials: ${preview.unresolvedCredentials.join(", ")}`);
69
+ }
70
+ return 0;
71
+ }
72
+ const result = await applyProfile({
73
+ cwd,
74
+ name,
75
+ agent,
76
+ skip: { mcps: splitList(flags.skipMcps), skills: splitList(flags.skipSkills) },
77
+ });
78
+ stdout(`Applied "${result.profile}" to ${result.agent}: ${result.mcpsApplied.length} MCPs, ${result.skillsApplied.length} skills` +
79
+ (result.skipped.length > 0 ? `, skipped ${result.skipped.join(", ")}` : ""));
80
+ for (const backup of result.backups)
81
+ stdout(`Backup: ${backup}`);
82
+ return 0;
83
+ }
84
+ if (subcommand === "export") {
85
+ const name = requirePositional(positional[0], "profile name");
86
+ const result = await exportProfile({ name, outputPath: flags.output, cwd });
87
+ stdout(`Exported to ${result.archivePath} (credentials redacted)`);
88
+ if (result.credentials.length > 0) {
89
+ stdout(`Importers must supply: ${result.credentials.map((spec) => spec.key).join(", ")}`);
90
+ }
91
+ return 0;
92
+ }
93
+ if (subcommand === "import") {
94
+ const archivePath = requirePositional(positional[0], "archive path");
95
+ const result = await importProfile({ archivePath, force: has("--force"), as: flags.as });
96
+ stdout(`Imported "${result.name}" (${result.mcpCount} MCPs, ${result.skillCount} skills)`);
97
+ reportMissingCredentials(result.missingCredentials, stdout);
98
+ return 0;
99
+ }
100
+ if (subcommand === "delete") {
101
+ const name = requirePositional(positional[0], "profile name");
102
+ await deleteProfile(name);
103
+ stdout(`Deleted profile "${name}"`);
104
+ return 0;
105
+ }
106
+ if (subcommand === "publish") {
107
+ const name = requirePositional(positional[0], "profile name");
108
+ if (!flags.slug || !flags.title)
109
+ throw new UsageError("--slug and --title are required");
110
+ const tokenManager = createRegistryTokenManager();
111
+ if ((await tokenManager.getAccessToken()) === null) {
112
+ throw new UsageError("Not signed in to the registry. Sign in from the web UI (Agent Environments) or set BRAINCTL_API_TOKEN.");
113
+ }
114
+ const result = await publishProfileToRegistry({
115
+ name,
116
+ slug: flags.slug,
117
+ title: flags.title,
118
+ summary: flags.summary,
119
+ version: flags.version,
120
+ cwd,
121
+ apiBaseUrl: await resolveRegistryApiBaseUrl(),
122
+ fetch: (input, init) => tokenManager.authenticatedFetch(typeof input === "string" ? input : input.toString(), init),
123
+ });
124
+ stdout(`Published "${result.slug}" v${result.version} to the registry (credentials redacted)`);
125
+ return 0;
126
+ }
127
+ if (subcommand === "install") {
128
+ const slug = requirePositional(positional[0], "registry slug");
129
+ const result = await installProfileFromRegistry({
130
+ slug,
131
+ force: has("--force"),
132
+ as: flags.as,
133
+ apiBaseUrl: await resolveRegistryApiBaseUrl(),
134
+ token: (await resolveRegistryApiToken())?.token,
135
+ });
136
+ stdout(`Installed "${result.name}" v${result.version} (${result.mcpCount} MCPs, ${result.skillCount} skills)`);
137
+ reportMissingCredentials(result.missingCredentials, stdout);
138
+ return 0;
139
+ }
140
+ throw new UsageError(USAGE);
141
+ }
142
+ function requirePositional(value, label) {
143
+ if (!value)
144
+ throw new UsageError(`${label} is required`);
145
+ return value;
146
+ }
147
+ function requireAgent(value) {
148
+ if (!value || !AGENT_NAMES.includes(value)) {
149
+ throw new UsageError(`agent is required (one of: ${AGENT_NAMES.join(", ")})`);
150
+ }
151
+ return value;
152
+ }
153
+ function splitList(value) {
154
+ if (!value)
155
+ return undefined;
156
+ const items = value
157
+ .split(",")
158
+ .map((item) => item.trim())
159
+ .filter(Boolean);
160
+ return items.length > 0 ? items : undefined;
161
+ }
162
+ function reportMissingCredentials(missing, stdout) {
163
+ if (missing.length === 0)
164
+ return;
165
+ stdout(`Credentials still needed (placeholders kept): ${missing.map((spec) => spec.key).join(", ")}`);
166
+ }
167
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/cli/profile.ts"],"names":[],"mappings":"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"}
@@ -7,4 +7,8 @@ export { applyProfile, previewProfileApply, type ProfileApplyItem, type ProfileA
7
7
  export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
8
8
  export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, type ProfileStoreOptions, } from "./store.js";
9
9
  export { exportProfile, importProfile, type ExportResult, type ImportResult } from "./transfer.js";
10
+ export { createRegistryConfigService, DEFAULT_REGISTRY_API_BASE_URL, DEFAULT_REGISTRY_FRONTEND_URL, registryConfigPath, resolveRegistryApiBaseUrl, resolveRegistryApiTarget, resolveRegistryApiToken, resolveRegistryFrontendUrl, type RegistryApiTarget, type RegistryConfigOptions, type RegistryConfigService, } from "./registry-config.js";
11
+ export { createRegistryTokenManager, type RegistryTokenManager, type RegistryTokenManagerOptions, } from "./registry-auth.js";
12
+ export { createRegistryClient, type RegisterGithubProfileInput, type RegistryClient, type RegistryInstallDescriptor, type RegistryProfile, } from "./registry-client.js";
13
+ export { installProfileFromRegistry, publishProfileToRegistry, type InstallFromRegistryInput, type InstallFromRegistryResult, type PublishProfileInput, type PublishProfileResult, } from "./registry-transfer.js";
10
14
  export { PROFILE_NAME_PATTERN, profileManifestSchema, profileMcpSchema, profileSchema, slugifyProfileName, type CredentialSpec, type Profile, type ProfileManifest, type ProfileMcp, type ProfileSummary, } from "./types.js";
@@ -7,5 +7,9 @@ export { applyProfile, previewProfileApply, } from "./apply.js";
7
7
  export { findUnresolvedCredentialKeys, redactMcpCredentials, resolveMcpCredentials, } from "./credentials.js";
8
8
  export { assertValidProfileName, copySkillBetweenProfiles, createProfile, deleteProfile, getProfile, listProfiles, profileDir, profilesRoot, profileSkillsDir, snapshotProfileFromAgent, updateProfile, writeProfile, } from "./store.js";
9
9
  export { exportProfile, importProfile } from "./transfer.js";
10
+ export { createRegistryConfigService, DEFAULT_REGISTRY_API_BASE_URL, DEFAULT_REGISTRY_FRONTEND_URL, registryConfigPath, resolveRegistryApiBaseUrl, resolveRegistryApiTarget, resolveRegistryApiToken, resolveRegistryFrontendUrl, } from "./registry-config.js";
11
+ export { createRegistryTokenManager, } from "./registry-auth.js";
12
+ export { createRegistryClient, } from "./registry-client.js";
13
+ export { installProfileFromRegistry, publishProfileToRegistry, } from "./registry-transfer.js";
10
14
  export { PROFILE_NAME_PATTERN, profileManifestSchema, profileMcpSchema, profileSchema, slugifyProfileName, } from "./types.js";
11
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,YAAY,EACZ,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,YAAY,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AACnG,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GAMnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,YAAY,EACZ,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,wBAAwB,EACxB,aAAa,EACb,YAAY,GAEb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAwC,MAAM,eAAe,CAAC;AACnG,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,kBAAkB,EAClB,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,GAI3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,0BAA0B,GAG3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,GAKrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GAKzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GAMnB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bearer-token manager for the profile registry: reads the stored access
3
+ * token, transparently refreshes it once on a 401, and persists rotated
4
+ * tokens back to the registry config file.
5
+ */
6
+ import { type RegistryConfigOptions, type RegistryConfigService } from "./registry-config.js";
7
+ export interface RegistryTokenManager {
8
+ /** Current access token, or null when signed out. */
9
+ getAccessToken(): Promise<string | null>;
10
+ /** Authenticated fetch that refreshes once on 401 and retries. */
11
+ authenticatedFetch(pathOrUrl: string, init?: RequestInit): Promise<Response>;
12
+ /** Persist tokens after a fresh sign-in. */
13
+ saveTokens(input: {
14
+ accessToken: string;
15
+ refreshToken?: string;
16
+ }): Promise<void>;
17
+ /** Sign out: drop both tokens. */
18
+ clear(): Promise<void>;
19
+ }
20
+ export interface RegistryTokenManagerOptions extends RegistryConfigOptions {
21
+ configService?: RegistryConfigService;
22
+ apiBaseUrl?: string;
23
+ fetch?: typeof fetch;
24
+ }
25
+ export declare function createRegistryTokenManager(options?: RegistryTokenManagerOptions): RegistryTokenManager;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Bearer-token manager for the profile registry: reads the stored access
3
+ * token, transparently refreshes it once on a 401, and persists rotated
4
+ * tokens back to the registry config file.
5
+ */
6
+ import { createRegistryConfigService, resolveRegistryApiBaseUrl, resolveRegistryApiToken, } from "./registry-config.js";
7
+ export function createRegistryTokenManager(options = {}) {
8
+ const config = options.configService ?? createRegistryConfigService(options);
9
+ const fetchImpl = options.fetch ?? fetch;
10
+ let refreshInFlight = null;
11
+ async function apiBase() {
12
+ return (options.apiBaseUrl ??
13
+ (await resolveRegistryApiBaseUrl({ ...options, configService: config }))).replace(/\/$/, "");
14
+ }
15
+ async function readAccessToken() {
16
+ const resolved = await resolveRegistryApiToken({ ...options, configService: config });
17
+ return resolved?.token ?? null;
18
+ }
19
+ async function refresh() {
20
+ if (refreshInFlight)
21
+ return refreshInFlight;
22
+ refreshInFlight = (async () => {
23
+ const refreshToken = (await config.get("apiRefreshToken")) ?? null;
24
+ if (!refreshToken)
25
+ return null;
26
+ const res = await fetchImpl(`${await apiBase()}/auth/refresh`, {
27
+ method: "POST",
28
+ headers: { "content-type": "application/json" },
29
+ body: JSON.stringify({ refresh_token: refreshToken }),
30
+ });
31
+ if (!res.ok) {
32
+ // Refresh token is dead — drop both so status reports signed-out.
33
+ await config.unset("apiRefreshToken");
34
+ await config.unset("apiToken");
35
+ return null;
36
+ }
37
+ const data = (await res.json());
38
+ await config.set("apiToken", data.access_token);
39
+ if (data.refresh_token)
40
+ await config.set("apiRefreshToken", data.refresh_token);
41
+ return data.access_token;
42
+ })().finally(() => {
43
+ refreshInFlight = null;
44
+ });
45
+ return refreshInFlight;
46
+ }
47
+ return {
48
+ getAccessToken: readAccessToken,
49
+ async saveTokens({ accessToken, refreshToken }) {
50
+ await config.set("apiToken", accessToken);
51
+ if (refreshToken)
52
+ await config.set("apiRefreshToken", refreshToken);
53
+ },
54
+ async clear() {
55
+ await config.unset("apiToken");
56
+ await config.unset("apiRefreshToken");
57
+ },
58
+ async authenticatedFetch(pathOrUrl, init = {}) {
59
+ const url = pathOrUrl.startsWith("http")
60
+ ? pathOrUrl
61
+ : `${await apiBase()}${pathOrUrl.startsWith("/") ? "" : "/"}${pathOrUrl}`;
62
+ const send = (token) => {
63
+ const headers = new Headers(init.headers);
64
+ if (token)
65
+ headers.set("authorization", `Bearer ${token}`);
66
+ return fetchImpl(url, { ...init, headers });
67
+ };
68
+ const first = await send(await readAccessToken());
69
+ if (first.status !== 401)
70
+ return first;
71
+ const refreshed = await refresh();
72
+ if (!refreshed)
73
+ return first;
74
+ return send(refreshed);
75
+ },
76
+ };
77
+ }
78
+ //# sourceMappingURL=registry-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-auth.js","sourceRoot":"","sources":["../../../src/core/agent-profiles/registry-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
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 interface RegistryProfile {
8
+ id: string;
9
+ slug: string;
10
+ title: string;
11
+ summary: string;
12
+ }
13
+ export interface RegistryProfileVersion {
14
+ id: string;
15
+ profile_id: string;
16
+ version: string;
17
+ }
18
+ export interface RegistryInstallDescriptor {
19
+ slug: string;
20
+ version: string;
21
+ source_kind: "brainctl" | "github" | string;
22
+ download_url: string;
23
+ checksum_sha256?: string | null;
24
+ }
25
+ export interface RegisterGithubProfileInput {
26
+ repoUrl: string;
27
+ slug: string;
28
+ title: string;
29
+ summary?: string;
30
+ refName?: string;
31
+ profilePath?: string;
32
+ manifestJson: Record<string, unknown>;
33
+ }
34
+ export interface RegistryClient {
35
+ getProfileBySlug(slug: string): Promise<RegistryProfile | null>;
36
+ createProfile(input: {
37
+ slug: string;
38
+ title: string;
39
+ summary?: string;
40
+ visibility?: "public" | "private";
41
+ }): Promise<RegistryProfile>;
42
+ createProfileVersion(input: {
43
+ profileId: string;
44
+ version: string;
45
+ changelog?: string;
46
+ manifestJson: Record<string, unknown>;
47
+ }): Promise<RegistryProfileVersion>;
48
+ uploadPackage(input: {
49
+ profileId: string;
50
+ versionId: string;
51
+ bytes: Uint8Array;
52
+ mimeType?: string;
53
+ }): Promise<unknown>;
54
+ publishProfileVersion(input: {
55
+ profileId: string;
56
+ versionId: string;
57
+ }): Promise<unknown>;
58
+ getInstallDescriptor(slug: string): Promise<RegistryInstallDescriptor>;
59
+ registerGithubProfile(input: RegisterGithubProfileInput): Promise<unknown>;
60
+ }
61
+ export declare function createRegistryClient(options: {
62
+ baseUrl: string;
63
+ token?: string;
64
+ fetch?: typeof fetch;
65
+ }): RegistryClient;