@floomhq/skills 1.1.2 → 1.1.4

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.
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `@floomhq/skills` 1.1.4: the last release under this name, and a working one.
4
+ *
5
+ * The installer was renamed to `cyborg-skills` on 2026-09-06, because the
6
+ * company is Cyborg Society and an installer that introduced itself as Floom
7
+ * Skills named the wrong thing on every line it printed.
8
+ *
9
+ * WHY THIS EXISTS RATHER THAN A BARE DEPRECATION. `npm deprecate` prints its
10
+ * notice at install time and then gets scrolled past, and a package whose last
11
+ * version stops working strands whoever pinned it in a script. So this release
12
+ * does both jobs: it still installs and runs every command exactly as 1.1.3
13
+ * did, by handing the process to `cyborg-skills`, and it says the new name on
14
+ * every run. Every version of this package, this one included, also carries an
15
+ * `npm deprecate` notice naming `cyborg-skills`; `scripts/verify-npm-deprecations.mjs`
16
+ * fails if that stops being true.
17
+ *
18
+ * IT DELEGATES IN PROCESS, not through a subprocess. `await import()` of the
19
+ * real entry keeps one process: the same argv, the same stdin/stdout/stderr
20
+ * (which matters for `mcp`, which speaks JSON-RPC on stdout, and for `--json`,
21
+ * which a caller pipes), the same TTY detection, the same exit code, the same
22
+ * signal handling. A spawned child would break every one of those in a way
23
+ * that is invisible until someone pipes the output.
24
+ *
25
+ * THE NOTICE GOES TO STDERR, always, never stdout. stdout is the MCP protocol
26
+ * channel and the `--json` channel; one stray line there corrupts a machine
27
+ * reader. Nothing here is suppressible, because a rename nobody is told about
28
+ * is the failure this file is here to prevent.
29
+ */
30
+
31
+ import { createRequire } from "node:module";
32
+ import { dirname, join, resolve } from "node:path";
33
+ import { pathToFileURL } from "node:url";
34
+
35
+ const require = createRequire(import.meta.url);
36
+
37
+ process.stderr.write(
38
+ "@floomhq/skills is now cyborg-skills.\n" +
39
+ "This is the last release under the old name. It still works: it runs cyborg-skills for you.\n" +
40
+ "Switch with: npm i -g cyborg-skills (then the command you type is `cyborg`)\n" +
41
+ "Or one-shot: npx -y cyborg-skills <command>\n\n",
42
+ );
43
+
44
+ /**
45
+ * The real entry, resolved from the dependency's own manifest rather than
46
+ * hardcoded as `cyborg-skills/dist/index.js`.
47
+ *
48
+ * Reading `bin` is what keeps this correct if the bundle output ever moves: a
49
+ * hardcoded path would fail at runtime, in a stranger's terminal, on a release
50
+ * where every test still passed because the tests import the source.
51
+ */
52
+ function resolveDelegateEntry() {
53
+ const manifestPath = require.resolve("cyborg-skills/package.json");
54
+ const manifest = require("cyborg-skills/package.json");
55
+ const bin = manifest.bin;
56
+ const relative = typeof bin === "string" ? bin : Object.values(bin ?? {})[0];
57
+ if (typeof relative !== "string" || relative.length === 0) {
58
+ throw new Error("cyborg-skills declares no bin entry to forward to");
59
+ }
60
+ const entry = resolve(join(dirname(manifestPath), relative));
61
+ return pathToFileURL(entry).href;
62
+ }
63
+
64
+ try {
65
+ await import(resolveDelegateEntry());
66
+ } catch (error) {
67
+ process.stderr.write(
68
+ `Could not run cyborg-skills: ${error instanceof Error ? error.message : String(error)}\n` +
69
+ "Install it directly: npm i -g cyborg-skills\n",
70
+ );
71
+ process.exitCode = 1;
72
+ }
package/package.json CHANGED
@@ -1,51 +1,34 @@
1
1
  {
2
2
  "name": "@floomhq/skills",
3
- "version": "1.1.2",
4
- "description": "Floom Skills CLI \u2014 publish, install, sync, and share AI agent skills.",
3
+ "version": "1.1.4",
4
+ "description": "Renamed to cyborg-skills. This release still works and forwards to it.",
5
5
  "license": "MIT",
6
- "homepage": "https://skills.floom.dev",
6
+ "homepage": "https://cyborg.floom.dev",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/floomhq/skills-mvp.git"
10
10
  },
11
- "types": "./dist/index.d.ts",
12
11
  "files": [
13
- "dist"
12
+ "bin"
14
13
  ],
15
14
  "publishConfig": {
16
15
  "access": "public"
17
16
  },
18
17
  "type": "module",
19
18
  "bin": {
20
- "floom-skills": "dist/index.js"
21
- },
22
- "scripts": {
23
- "build": "tsc -p tsconfig.typecheck.json --noEmit && node scripts/build-bundle.mjs",
24
- "dev": "tsx watch src/index.ts",
25
- "lint": "tsc -p tsconfig.typecheck.json --noEmit --pretty false",
26
- "pack:check": "node scripts/verify-package.mjs",
27
- "pack:smoke": "pnpm run build && node scripts/verify-package.mjs --install-smoke",
28
- "prepack": "pnpm run build",
29
- "prepublishOnly": "pnpm run build && pnpm run pack:check",
30
- "start": "node dist/index.js",
31
- "test": "tsx --tsconfig tsconfig.typecheck.json --test --experimental-test-isolation=none --test-concurrency=1 \"src/**/*.test.ts\"",
32
- "typecheck": "tsc -p tsconfig.typecheck.json --noEmit"
19
+ "floom-skills": "bin/floom-skills.mjs"
33
20
  },
34
21
  "dependencies": {
35
- "@modelcontextprotocol/sdk": "^1.12.2",
36
- "chalk": "^5.3.0",
37
- "commander": "^12.1.0",
38
- "ora": "^8.1.0",
39
- "prompts": "^2.4.2",
40
- "tar": "^7.4.3",
41
- "zod": "^3.23.8"
22
+ "cyborg-skills": "2.0.0"
42
23
  },
43
24
  "devDependencies": {
44
- "@floom/shared": "workspace:*",
45
- "esbuild": "^0.27.7",
46
- "@types/node": "^22.0.0",
47
- "@types/prompts": "^2.4.9",
48
- "tsx": "^4.19.0",
49
- "typescript": "^5.6.0"
25
+ "@types/node": "^22.0.0"
26
+ },
27
+ "scripts": {
28
+ "build": "node --version > /dev/null",
29
+ "lint": "node --check bin/floom-skills.mjs",
30
+ "pack:check": "node scripts/verify-package.mjs",
31
+ "test": "node --test test/forwards.test.mjs",
32
+ "typecheck": "node --check bin/floom-skills.mjs"
50
33
  }
51
- }
34
+ }
package/README.md DELETED
@@ -1,162 +0,0 @@
1
- # @floomhq/skills
2
-
3
- The Floom Skills CLI: publish, install, sync, and share AI agent skills.
4
-
5
- Docs: <https://skills.floom.dev/docs>
6
-
7
- ## Install
8
-
9
- ```bash
10
- npm i -g @floomhq/skills
11
- ```
12
-
13
- Pinned no-install form for automation:
14
-
15
- ```bash
16
- npx -y @floomhq/skills@1.1.0 --help
17
- ```
18
-
19
- ## Login
20
-
21
- ```bash
22
- floom-skills login
23
- ```
24
-
25
- The login command starts a browser device flow. Sign in at skills.floom.dev with
26
- Google or email, approve the device code, and the CLI stores the session at
27
- `~/.floom/auth.json`.
28
-
29
- Check the active account:
30
-
31
- ```bash
32
- floom-skills account
33
- ```
34
-
35
- ## First Skill
36
-
37
- ```bash
38
- floom-skills push ~/.claude/skills/my-skill
39
- ```
40
-
41
- The folder must contain `SKILL.md`. Each push creates a Library version.
42
-
43
- Create a starter skill when the folder does not exist yet:
44
-
45
- ```bash
46
- floom-skills new my-skill --agent claude
47
- ```
48
-
49
- ## Bulk Sync
50
-
51
- ```bash
52
- floom-skills sync
53
- ```
54
-
55
- Zero-arg `floom-skills sync` detects installed agents and supported scopes, reviews
56
- local-to-Library and Library-to-local differences, and applies the selected
57
- plan. Use `--dry-run` to preview the plan without changing files or Library
58
- records.
59
-
60
- Library-to-local only:
61
-
62
- ```bash
63
- floom-skills pull
64
- floom-skills pull --agent claude,codex
65
- ```
66
-
67
- Local-to-Library only:
68
-
69
- ```bash
70
- floom-skills push
71
- ```
72
-
73
- Use the installed `floom-skills` command for interactive terminal work. Use the pinned
74
- `npx -y @floomhq/skills@1.1.0 <command>` form for automation and agent-run
75
- commands that need reproducible CLI behavior.
76
-
77
- ## Releasing
78
-
79
- Releases publish the exact smoke-tested npm tarball via
80
- `.github/workflows/publish-cli.yml`, triggered by a `skills-v*` tag.
81
- Provenance is disabled while the source repository remains private.
82
-
83
- ### Hard pre-publish smoke gate
84
-
85
- Every `npm publish` is gated by `packages/cli/scripts/pre-publish-smoke.sh`,
86
- which packs the tarball, installs it into an isolated `$HOME`, and drives
87
- every subcommand the way a real user would. If anything fails, the workflow
88
- fails BEFORE `npm publish` runs — no broken CLI can reach npm `latest`.
89
-
90
- Background: in 2026-05 we shipped `3.0.0` → `3.0.1` → `3.0.2` within hours
91
- because `3.0.0` hit npm `latest` with three P0s that code review missed:
92
- `--help` ran the destructive body, `--help | head` threw an unhandled EPIPE,
93
- and unknown commands silently rendered the dashboard. Only an out-of-band
94
- real-terminal smoke caught them. This script is that smoke, baked into the
95
- publish pipeline.
96
-
97
- ### Before pushing a `skills-v*` tag
98
-
99
- Run the same local gates from the repo root:
100
-
101
- ```bash
102
- pnpm --filter @floomhq/skills --fail-if-no-match lint
103
- pnpm --filter @floomhq/skills --fail-if-no-match test
104
- pnpm --filter @floomhq/skills --fail-if-no-match pack:smoke
105
- packages/cli/scripts/pre-publish-smoke.sh
106
- ```
107
-
108
- If anything fails, fix the issue first. Do not push the tag.
109
-
110
- ### Smoke-only workflow run
111
-
112
- To validate the smoke script itself without publishing (e.g. after editing
113
- `scripts/pre-publish-smoke.sh`):
114
-
115
- ```
116
- GitHub → Actions → Publish @floomhq/skills → Run workflow
117
- smoke_only: true
118
- ```
119
-
120
- The workflow will build, run the smoke, and stop. No `npm publish`, no
121
- Homebrew dispatch.
122
-
123
- ### Manual publish (rare)
124
-
125
- To publish without a tag (e.g. retag an existing version under a different
126
- dist-tag), use `workflow_dispatch` with `smoke_only: false` and the desired
127
- `tag` input. The smoke gate still runs first.
128
-
129
- ## What the pre-publish smoke checks
130
-
131
- See `scripts/pre-publish-smoke.sh` for the full assertion list. Summary:
132
-
133
- | Stage | Asserts |
134
- |------|---------|
135
- | 1 | Tarball builds, packs, installs cleanly into isolated `$HOME`; installed `floom-skills --version` matches `package.json` |
136
- | 2 | **Every** subcommand `--help` exits 0, starts with `Usage: floom-skills`, writes no `~/.floom/auth.json`, prints no "Signed (in|out)" / "Waiting for browser" (P0 #1 from 3.0.0) |
137
- | 3 | `floom-skills --help \| head -3` and `floom-skills push --help \| head -1` print no EPIPE / "Unhandled error event" (P0 #2 from 3.0.0) |
138
- | 4 | `floom-skills <unknown>` exits non-zero with "unknown command" + "did you mean" hint (P0 #3 from 3.0.0) |
139
- | 5 | Bare `floom-skills --help` exits 0 with grouped help |
140
- | 6 | Unauth `whoami` / `account` / `logout` exit 0 idempotent; unauth `status` / `sync --json` / `push --json` exit non-zero with no stack trace |
141
- | 7 | `floom-skills logout extra-positional` is rejected with non-zero exit AND `~/.floom/auth.json` is preserved (no destructive body) |
142
- | 8 | **Agent detection** picks up fake `.claude/`, `.codex/`, `.cursor/` marker dirs in the isolated `$HOME` (verified by parsing `floom-skills doctor --json`); bare `floom-skills sync` / `floom-skills pull` with planted agents do not crash unauth (clean `signedIn:false` envelope). Note: fan-out *behaviour itself* requires real auth, so it is exercised at the **unit-test layer** by `src/commands/sync.fanout.test.ts`, which the publish workflow runs as a separate hard gate before the smoke. |
143
-
144
- If any assertion fails, the publish job fails. The smoke script exits non-zero
145
- on the first failure and prints a summary of every failed check.
146
-
147
- ## Files
148
-
149
- ```
150
- packages/cli/
151
- ├── src/ # TypeScript source
152
- │ ├── index.ts # CLI entry point (commander)
153
- │ ├── commands/ # one file per subcommand
154
- │ ├── lib/ # shared helpers
155
- │ └── cli-smoke.test.ts # unit-level smoke (P0 lock-ins)
156
- ├── scripts/
157
- │ ├── build-bundle.mjs # esbuild → dist/index.js
158
- │ ├── verify-package.mjs # pre-pack file allowlist check
159
- │ └── pre-publish-smoke.sh # E2E smoke driven against tarball
160
- ├── package.json
161
- └── CHANGELOG.md
162
- ```
package/dist/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};