@floomhq/floom-mcp-sync 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,7 +6,13 @@ Tiny MCP server for Floom skills. This package is part of the Floom Version 1 sy
6
6
  npx -y @floomhq/floom-mcp-sync
7
7
  ```
8
8
 
9
- On startup it reads `~/.floom/config.json`, fetches published, saved, and subscribed library skills, and writes missing files to `~/.claude/skills/`. The background sync behavior is a Version 1 preview path.
9
+ On startup it reads `~/.floom/config.json`, fetches published, saved, and subscribed library skills, and writes missing files to the configured local skills directory. The background sync behavior is a Version 1 preview path.
10
+
11
+ Targets:
12
+
13
+ - default: Claude Code, `~/.claude/skills/`
14
+ - Codex: `FLOOM_TARGET=codex npx -y @floomhq/floom-mcp-sync`, `~/.codex/skills/`
15
+ - direct override: `FLOOM_SKILLS_DIR=/path/to/skills npx -y @floomhq/floom-mcp-sync`
10
16
 
11
17
  Sync stores a machine-local manifest next to the Floom CLI config at `~/.floom/sync-manifest.json`.
12
18
  Version 1 sync does not replace existing local Markdown files. Remote updates, existing untracked
package/dist/lib/paths.js CHANGED
@@ -4,7 +4,21 @@ import { assertValidSlug } from "./slug.js";
4
4
  export function configPath() {
5
5
  return process.env.FLOOM_CONFIG_PATH ?? join(homedir(), ".floom", "config.json");
6
6
  }
7
+ export function agentTarget() {
8
+ const raw = (process.env.FLOOM_TARGET ?? process.env.FLOOM_AGENT_TARGET ?? "claude").toLowerCase();
9
+ if (raw === "codex")
10
+ return "codex";
11
+ if (raw === "claude")
12
+ return "claude";
13
+ throw new Error("Invalid FLOOM_TARGET. Use claude or codex.");
14
+ }
7
15
  export function skillsDir() {
16
+ if (process.env.FLOOM_SKILLS_DIR)
17
+ return process.env.FLOOM_SKILLS_DIR;
18
+ if (agentTarget() === "codex") {
19
+ const codexHome = process.env.CODEX_HOME ?? join(homedir(), ".codex");
20
+ return process.env.CODEX_SKILLS_DIR ?? join(codexHome, "skills");
21
+ }
8
22
  return process.env.CLAUDE_SKILLS_DIR ?? join(homedir(), ".claude", "skills");
9
23
  }
10
24
  export function skillPath(slug) {
package/dist/server.js CHANGED
@@ -6,7 +6,8 @@ import { installSkill } from "./tools/install.js";
6
6
  import { publishSkill } from "./tools/publish.js";
7
7
  import { listLibraries, moveSkill, subscribeLibrary, unsubscribeLibrary, } from "./tools/libraries.js";
8
8
  import { searchSkills } from "./tools/search.js";
9
- const SERVER_VERSION = "1.0.4";
9
+ import { agentTarget, skillsDir } from "./lib/paths.js";
10
+ const SERVER_VERSION = "1.0.5";
10
11
  const DEFAULT_INTERVAL_MS = 60_000;
11
12
  const MIN_INTERVAL_MS = 10_000;
12
13
  const VERSION_RE = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,63}$/;
@@ -33,7 +34,7 @@ Usage
33
34
 
34
35
  Behavior
35
36
  Starts a stdio MCP server.
36
- Syncs published, saved, and subscribed library skills into ~/.claude/skills/.
37
+ Syncs published, saved, and subscribed library skills into the configured local skills directory.
37
38
  Polls for updates while the MCP process is running.
38
39
 
39
40
  Options
@@ -42,6 +43,10 @@ Options
42
43
 
43
44
  Env
44
45
  FLOOM_API_URL Override the API host.
46
+ FLOOM_TARGET claude or codex. Default: claude.
47
+ FLOOM_SKILLS_DIR Override the local skills directory directly.
48
+ CLAUDE_SKILLS_DIR Override Claude's skills directory.
49
+ CODEX_SKILLS_DIR Override Codex's skills directory.
45
50
  FLOOM_SYNC_INTERVAL_MS Poll interval in milliseconds. Minimum: 10000.
46
51
  `.trimStart();
47
52
  }
@@ -96,7 +101,7 @@ function toolList() {
96
101
  tools: [
97
102
  {
98
103
  name: "floom_search_skills",
99
- description: "Search public Floom skills through the live API.",
104
+ description: "Search public Floom skills before recreating reusable behavior from scratch.",
100
105
  inputSchema: {
101
106
  type: "object",
102
107
  properties: {
@@ -111,7 +116,7 @@ function toolList() {
111
116
  },
112
117
  {
113
118
  name: "floom_install_skill",
114
- description: "Fetch a Floom skill by slug and install it into ~/.claude/skills/.",
119
+ description: "Fetch a Floom skill by slug and install it into the configured local skills directory.",
115
120
  inputSchema: {
116
121
  type: "object",
117
122
  properties: {
@@ -319,7 +324,12 @@ async function handleRequest(message) {
319
324
  stdout.write(response(id, {
320
325
  protocolVersion: "2025-06-18",
321
326
  capabilities: { tools: {} },
322
- serverInfo: { name: "floom-mcp-sync", version: SERVER_VERSION },
327
+ serverInfo: {
328
+ name: "floom-mcp-sync",
329
+ version: SERVER_VERSION,
330
+ target: agentTarget(),
331
+ skillsDir: skillsDir(),
332
+ },
323
333
  }));
324
334
  return;
325
335
  }
@@ -345,7 +355,7 @@ async function main() {
345
355
  if (handleCliArgs(process.argv.slice(2)))
346
356
  return;
347
357
  const intervalMs = resolvePollIntervalMs();
348
- process.stderr.write(`[floom] starting sync poller (interval ${intervalMs}ms)\n`);
358
+ process.stderr.write(`[floom] starting sync poller for ${agentTarget()} at ${skillsDir()} (interval ${intervalMs}ms)\n`);
349
359
  const syncState = { inFlight: true };
350
360
  void autoSync().catch((err) => {
351
361
  process.stderr.write(`[floom] initial sync failed: ${err instanceof Error ? err.message : String(err)}\n`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floomhq/floom-mcp-sync",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "Lightweight Floom MCP server for installing, publishing, and startup-syncing skills.",
5
5
  "license": "MIT",
6
6
  "type": "module",