@ryukin-dev/pi-featherless-kali 1.1.2 → 1.1.3
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/CHANGELOG.md +6 -0
- package/bin/kaliai.js +61 -44
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.3
|
|
4
|
+
|
|
5
|
+
- Extension wird jetzt über `pi install npm:@ryukin-dev/pi-featherless-kali` als Pi-Paket geladen.
|
|
6
|
+
- Behebt das Problem, dass der Featherless-Provider nicht unter `/login` → API keys erschien.
|
|
7
|
+
- Alte manuelle Extension-/Skill-Kopien werden beim Start bereinigt.
|
|
8
|
+
|
|
3
9
|
## 1.1.2
|
|
4
10
|
|
|
5
11
|
- `kaliai` installiert den Pi Coding Agent automatisch, wenn er fehlt.
|
package/bin/kaliai.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { spawnSync, execFileSync } from "node:child_process";
|
|
3
|
-
import { existsSync, mkdirSync, rmSync,
|
|
3
|
+
import { existsSync, mkdirSync, rmSync, readdirSync, readlinkSync, readFileSync } from "node:fs";
|
|
4
4
|
import { homedir, platform } from "node:os";
|
|
5
5
|
import { dirname, join, basename } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
@@ -9,8 +9,6 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
9
9
|
const SOURCE_DIR = join(__dirname, "..");
|
|
10
10
|
const HOME = homedir();
|
|
11
11
|
const AGENT_DIR = join(HOME, ".pi", "agent");
|
|
12
|
-
const EXT_DIR = join(AGENT_DIR, "extensions", "pi-featherless");
|
|
13
|
-
const SKILLS_DIR = join(AGENT_DIR, "skills");
|
|
14
12
|
const PI_PACKAGE = "@earendil-works/pi-coding-agent";
|
|
15
13
|
const NPM_PACKAGE = "@ryukin-dev/pi-featherless-kali";
|
|
16
14
|
|
|
@@ -51,6 +49,59 @@ function ensurePiAgentInstalled() {
|
|
|
51
49
|
return fresh;
|
|
52
50
|
}
|
|
53
51
|
|
|
52
|
+
function removeLegacyCopy() {
|
|
53
|
+
const legacyExt = join(AGENT_DIR, "extensions", "pi-featherless");
|
|
54
|
+
if (existsSync(legacyExt)) {
|
|
55
|
+
print("==> Entferne alte manuelle Extension...");
|
|
56
|
+
rmSync(legacyExt, { recursive: true, force: true });
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const skillsDir = join(AGENT_DIR, "skills");
|
|
60
|
+
if (!existsSync(skillsDir)) return;
|
|
61
|
+
for (const entry of readdirSync(skillsDir, { withFileTypes: true })) {
|
|
62
|
+
if (!entry.isSymbolicLink()) continue;
|
|
63
|
+
const target = readlinkSync(join(skillsDir, entry.name));
|
|
64
|
+
if (target.includes("pi-featherless-kali")) {
|
|
65
|
+
rmSync(join(skillsDir, entry.name), { recursive: true, force: true });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function installPiPackage() {
|
|
71
|
+
print("==> Installiere KaliAI als Pi-Paket...");
|
|
72
|
+
const piCli = getPiCliPath();
|
|
73
|
+
const result = spawnSync(process.execPath, [piCli, "install", `npm:${NPM_PACKAGE}`], {
|
|
74
|
+
stdio: "inherit",
|
|
75
|
+
});
|
|
76
|
+
if (result.status !== 0) {
|
|
77
|
+
print("Fehler: KaliAI Pi-Paket konnte nicht installiert werden.");
|
|
78
|
+
process.exit(1);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function getInstalledPiPackageDir() {
|
|
83
|
+
const scoped = join(AGENT_DIR, "npm", NPM_PACKAGE);
|
|
84
|
+
if (existsSync(scoped)) return scoped;
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function installSkillDeps(skillPath) {
|
|
89
|
+
if (existsSync(join(skillPath, "package.json")) && !existsSync(join(skillPath, "node_modules"))) {
|
|
90
|
+
print(` Installiere Skill-Abhängigkeiten: ${basename(skillPath)}`);
|
|
91
|
+
spawnSync("npm", ["install"], { cwd: skillPath, stdio: "inherit" });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function installPiPackageSkillDeps() {
|
|
96
|
+
const pkgDir = getInstalledPiPackageDir();
|
|
97
|
+
if (!pkgDir) return;
|
|
98
|
+
const skillsDir = join(pkgDir, "skills");
|
|
99
|
+
if (!existsSync(skillsDir)) return;
|
|
100
|
+
for (const name of readdirSync(skillsDir)) {
|
|
101
|
+
installSkillDeps(join(skillsDir, name));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
54
105
|
function readPackageVersion(dir) {
|
|
55
106
|
try {
|
|
56
107
|
const pkg = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
|
|
@@ -76,48 +127,11 @@ function readChangelog(dir) {
|
|
|
76
127
|
}
|
|
77
128
|
}
|
|
78
129
|
|
|
79
|
-
function installSkillDeps(skillPath) {
|
|
80
|
-
if (existsSync(join(skillPath, "package.json")) && !existsSync(join(skillPath, "node_modules"))) {
|
|
81
|
-
print(` Installiere Skill-Abhängigkeiten: ${basename(skillPath)}`);
|
|
82
|
-
spawnSync("npm", ["install"], { cwd: skillPath, stdio: "inherit" });
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
function linkOrCopy(source, target) {
|
|
87
|
-
if (existsSync(target)) rmSync(target, { recursive: true, force: true });
|
|
88
|
-
try {
|
|
89
|
-
symlinkSync(source, target, platform() === "win32" ? "junction" : "dir");
|
|
90
|
-
} catch {
|
|
91
|
-
cpSync(source, target, { recursive: true });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function installExtension() {
|
|
96
|
-
print("==> KaliAI Extension wird eingerichtet...");
|
|
97
|
-
if (existsSync(EXT_DIR)) rmSync(EXT_DIR, { recursive: true, force: true });
|
|
98
|
-
cpSync(SOURCE_DIR, EXT_DIR, {
|
|
99
|
-
recursive: true,
|
|
100
|
-
filter: (src) =>
|
|
101
|
-
!src.includes("node_modules") &&
|
|
102
|
-
!src.includes(".git"),
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
const skillsSource = join(SOURCE_DIR, "skills");
|
|
106
|
-
if (existsSync(skillsSource)) {
|
|
107
|
-
mkdirSync(SKILLS_DIR, { recursive: true });
|
|
108
|
-
for (const name of readdirSync(skillsSource)) {
|
|
109
|
-
const src = join(skillsSource, name);
|
|
110
|
-
const dst = join(SKILLS_DIR, name);
|
|
111
|
-
linkOrCopy(src, dst);
|
|
112
|
-
installSkillDeps(dst);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
print("==> KaliAI Extension bereit.");
|
|
116
|
-
}
|
|
117
|
-
|
|
118
130
|
async function startChat() {
|
|
119
|
-
installExtension();
|
|
120
131
|
const piCli = ensurePiAgentInstalled();
|
|
132
|
+
removeLegacyCopy();
|
|
133
|
+
installPiPackage();
|
|
134
|
+
installPiPackageSkillDeps();
|
|
121
135
|
print("==> Starte KaliAI Chat UI...");
|
|
122
136
|
spawnSync(process.execPath, [piCli], { stdio: "inherit" });
|
|
123
137
|
}
|
|
@@ -132,7 +146,10 @@ async function runUpdate() {
|
|
|
132
146
|
print("Update fehlgeschlagen.");
|
|
133
147
|
process.exit(result.status ?? 1);
|
|
134
148
|
}
|
|
135
|
-
|
|
149
|
+
const piCli = ensurePiAgentInstalled();
|
|
150
|
+
removeLegacyCopy();
|
|
151
|
+
installPiPackage();
|
|
152
|
+
installPiPackageSkillDeps();
|
|
136
153
|
const after = readPackageVersion(SOURCE_DIR);
|
|
137
154
|
print("==> KaliAI aktualisiert" + (before && after ? `: v${before} -> v${after}` : ""));
|
|
138
155
|
print("");
|