kangentic 0.30.0 → 0.31.0

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
@@ -25,7 +25,9 @@ npx kangentic /path/to/your/project
25
25
  3. Installs per platform:
26
26
  - **Windows:** Runs NSIS installer silently to `%LOCALAPPDATA%\Programs\Kangentic\`
27
27
  - **macOS:** Extracts .zip to `~/Applications/Kangentic.app`
28
- - **Linux:** Installs .deb via `sudo dpkg -i` (prompts for password)
28
+ - **Linux:** Installs .rpm on RPM-family systems (`sudo dnf install` on Fedora/RHEL,
29
+ `sudo zypper install` on openSUSE, falling back to `sudo rpm -i`) or .deb elsewhere
30
+ (`sudo apt install`, falling back to `sudo dpkg -i`); prompts for password
29
31
  4. Launches the app
30
32
 
31
33
  ## Updates
package/bin/kangentic.js CHANGED
@@ -31,7 +31,7 @@ function getPlatformInfo() {
31
31
  return { platform: 'darwin', arch, extension: 'zip' };
32
32
  }
33
33
  if (platform === 'linux') {
34
- return { platform: 'linux', arch: 'x64', extension: 'deb' };
34
+ return { platform: 'linux', arch: 'x64' };
35
35
  }
36
36
 
37
37
  return null;
@@ -83,22 +83,8 @@ function getArtifactFilename(platformInfo) {
83
83
  return `Kangentic-${version}-${platformInfo.arch}-mac.zip`;
84
84
  }
85
85
  if (platformInfo.platform === 'linux') {
86
- // Check if rpm-based system
87
- try {
88
- execFileSync('which', ['rpm'], { stdio: 'ignore' });
89
- const hasApt = (() => {
90
- try {
91
- execFileSync('which', ['apt'], { stdio: 'ignore' });
92
- return true;
93
- } catch {
94
- return false;
95
- }
96
- })();
97
- if (!hasApt) {
98
- return `kangentic-${version}-1.x86_64.rpm`;
99
- }
100
- } catch {
101
- // not rpm-based, use deb
86
+ if (commandExists('rpm') && !commandExists('apt')) {
87
+ return `kangentic-${version}-1.x86_64.rpm`;
102
88
  }
103
89
  return `kangentic_${version}_amd64.deb`;
104
90
  }
@@ -206,14 +192,39 @@ function installMacOS(artifactPath) {
206
192
  console.log('Installation complete.');
207
193
  }
208
194
 
195
+ function commandExists(command) {
196
+ try {
197
+ execFileSync('which', [command], { stdio: 'ignore' });
198
+ return true;
199
+ } catch {
200
+ return false;
201
+ }
202
+ }
203
+
209
204
  function installLinux(artifactPath) {
210
205
  console.log('Installing Kangentic...');
211
206
  if (artifactPath.endsWith('.deb')) {
212
- console.log('Running: sudo dpkg -i (you may be prompted for your password)');
213
- execFileSync('sudo', ['dpkg', '-i', artifactPath], { stdio: 'inherit' });
207
+ if (commandExists('apt')) {
208
+ console.log('Running: sudo apt install (you may be prompted for your password)');
209
+ execFileSync('sudo', ['apt', 'install', '-y', artifactPath], { stdio: 'inherit' });
210
+ } else {
211
+ console.log('Running: sudo dpkg -i (you may be prompted for your password)');
212
+ execFileSync('sudo', ['dpkg', '-i', artifactPath], { stdio: 'inherit' });
213
+ }
214
214
  } else if (artifactPath.endsWith('.rpm')) {
215
- console.log('Running: sudo rpm -i (you may be prompted for your password)');
216
- execFileSync('sudo', ['rpm', '-i', artifactPath], { stdio: 'inherit' });
215
+ if (commandExists('dnf')) {
216
+ console.log('Running: sudo dnf install (you may be prompted for your password)');
217
+ execFileSync('sudo', ['dnf', 'install', '-y', artifactPath], { stdio: 'inherit' });
218
+ } else if (commandExists('zypper')) {
219
+ // openSUSE ships zypper, not dnf. Without this branch it falls through to `rpm -i`,
220
+ // which enforces Requires without resolving them - the exact install failure this
221
+ // launcher path exists to avoid.
222
+ console.log('Running: sudo zypper install (you may be prompted for your password)');
223
+ execFileSync('sudo', ['zypper', '--non-interactive', 'install', artifactPath], { stdio: 'inherit' });
224
+ } else {
225
+ console.log('Running: sudo rpm -i (you may be prompted for your password)');
226
+ execFileSync('sudo', ['rpm', '-i', artifactPath], { stdio: 'inherit' });
227
+ }
217
228
  }
218
229
  console.log('Installation complete.');
219
230
  }
@@ -432,4 +443,13 @@ if (require.main === module) {
432
443
  }
433
444
 
434
445
  // Exported for testing
435
- module.exports = { isInstalled, getVersionMarkerPath, writeVersionMarker, getInstallPath, getTempDir };
446
+ module.exports = {
447
+ isInstalled,
448
+ getVersionMarkerPath,
449
+ writeVersionMarker,
450
+ getInstallPath,
451
+ getTempDir,
452
+ getPlatformInfo,
453
+ getArtifactFilename,
454
+ installLinux,
455
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kangentic",
3
- "version": "0.30.0",
3
+ "version": "0.31.0",
4
4
  "description": "Install and launch Kangentic -- visual agent orchestration for Claude Code",
5
5
  "bin": {
6
6
  "kangentic": "bin/kangentic.js"