skills-layer 0.1.0 → 0.1.1
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/package.json +1 -5
- package/scripts/postinstall.mjs +0 -92
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skills-layer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Public CLI for Skills Layer Cloud.",
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"files": [
|
|
21
21
|
"bin/skills-layer.js",
|
|
22
22
|
"public/skills-layer-public.mjs",
|
|
23
|
-
"scripts/postinstall.mjs",
|
|
24
23
|
"scripts/skills-layer.mjs",
|
|
25
24
|
"docs/assets/*.svg"
|
|
26
25
|
],
|
|
@@ -30,8 +29,5 @@
|
|
|
30
29
|
"publishConfig": {
|
|
31
30
|
"access": "public"
|
|
32
31
|
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"postinstall": "node scripts/postinstall.mjs"
|
|
35
|
-
},
|
|
36
32
|
"license": "SEE LICENSE IN LICENSE"
|
|
37
33
|
}
|
package/scripts/postinstall.mjs
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
5
|
-
|
|
6
|
-
const BANNER = ` ____ _ _ _ _ _
|
|
7
|
-
/ ___|| | _(_) | |___ | | __ _ _ _ ___ _ __
|
|
8
|
-
\\___ \\| |/ / | | / __| | | / _\` | | | |/ _ \\ '__|
|
|
9
|
-
___) | <| | | \\__ \\ | |__| (_| | |_| | __/ |
|
|
10
|
-
|____/|_|\\_\\_|_|_|___/ |_____\\__,_|\\__, |\\___|_|
|
|
11
|
-
|___/
|
|
12
|
-
Skills-Layer
|
|
13
|
-
AI Agent first platform for Skills`;
|
|
14
|
-
|
|
15
|
-
if (await shouldShowAndRecordInstallBanner(process.env)) {
|
|
16
|
-
process.stdout.write([
|
|
17
|
-
"",
|
|
18
|
-
BANNER,
|
|
19
|
-
"",
|
|
20
|
-
"Thanks for installing Skills-Layer.",
|
|
21
|
-
"Run `skills-layer setup` to connect AI tools and Security hooks, or `skills-layer --help` for commands.",
|
|
22
|
-
""
|
|
23
|
-
].join("\n"));
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
async function shouldShowAndRecordInstallBanner(env) {
|
|
27
|
-
const mode = normalizeBannerMode(env.SKILLS_LAYER_BANNER);
|
|
28
|
-
if (mode === "off" || isTruthy(env.CI) || isTruthy(env.SKILLS_LAYER_NO_INSTALL_BANNER) || isTruthy(env.SKILLS_LAYER_NO_BANNER) || env.npm_config_loglevel === "silent") {
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
if (mode === "always") {
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
if (!process.stdout.isTTY && !isTruthy(env.SKILLS_LAYER_BANNER_TTY)) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
const displayLimit = parseBannerDisplayLimit(env.SKILLS_LAYER_BANNER_LIMIT);
|
|
38
|
-
if (displayLimit <= 0) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
const statePath = resolveBannerStatePath(env);
|
|
42
|
-
if (!statePath) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
try {
|
|
46
|
-
const state = await readBannerState(statePath);
|
|
47
|
-
if (state.displayCount >= displayLimit) {
|
|
48
|
-
return false;
|
|
49
|
-
}
|
|
50
|
-
await mkdir(dirname(statePath), { recursive: true });
|
|
51
|
-
await writeFile(statePath, JSON.stringify({ version: 1, displayCount: state.displayCount + 1, updatedAt: new Date().toISOString() }, null, 2), "utf8");
|
|
52
|
-
return true;
|
|
53
|
-
} catch {
|
|
54
|
-
return false;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function readBannerState(path) {
|
|
59
|
-
try {
|
|
60
|
-
const parsed = JSON.parse(await readFile(path, "utf8"));
|
|
61
|
-
return { displayCount: typeof parsed.displayCount === "number" ? Math.max(0, parsed.displayCount) : 0 };
|
|
62
|
-
} catch {
|
|
63
|
-
return { displayCount: 0 };
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function resolveBannerStatePath(env) {
|
|
68
|
-
const homeRoot = process.platform === "win32" ? firstNonEmpty(env.APPDATA, env.USERPROFILE, env.HOME) : firstNonEmpty(env.XDG_CONFIG_HOME, env.HOME ? join(env.HOME, ".skills-layer") : undefined);
|
|
69
|
-
if (!homeRoot) {
|
|
70
|
-
return null;
|
|
71
|
-
}
|
|
72
|
-
const stateDir = process.platform === "win32" || String(env.XDG_CONFIG_HOME ?? "").trim() ? join(homeRoot, "skills-layer") : homeRoot;
|
|
73
|
-
return join(stateDir, "banner-state.json");
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function normalizeBannerMode(value) {
|
|
77
|
-
const normalized = String(value ?? "").trim().toLowerCase();
|
|
78
|
-
return normalized === "always" || normalized === "off" ? normalized : "auto";
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
function parseBannerDisplayLimit(value) {
|
|
82
|
-
const parsed = Number.parseInt(String(value ?? ""), 10);
|
|
83
|
-
return Number.isFinite(parsed) ? Math.max(0, parsed) : 2;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function firstNonEmpty(...values) {
|
|
87
|
-
return values.find((value) => typeof value === "string" && value.trim())?.trim() ?? null;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function isTruthy(value) {
|
|
91
|
-
return ["1", "true", "yes", "on"].includes(String(value ?? "").trim().toLowerCase());
|
|
92
|
-
}
|