@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.
- package/bin/floom-skills.mjs +72 -0
- package/package.json +15 -32
- package/README.md +0 -162
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -9457
- package/dist/version.d.ts +0 -1
- package/dist/version.js +0 -1
|
@@ -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.
|
|
4
|
-
"description": "
|
|
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://
|
|
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
|
-
"
|
|
12
|
+
"bin"
|
|
14
13
|
],
|
|
15
14
|
"publishConfig": {
|
|
16
15
|
"access": "public"
|
|
17
16
|
},
|
|
18
17
|
"type": "module",
|
|
19
18
|
"bin": {
|
|
20
|
-
"floom-skills": "
|
|
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
|
-
"
|
|
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
|
-
"@
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
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 {};
|