Handling the status of skills (#23)

* chore: bump version to 0.20.0 [skip ci]

* revert: remove automatic skill dependency installation system

- Removed dependency installation loading state from SkillSetupWizard
- Reverted SkillRuntime dependency checking and installation methods
- Cleaned up dependency-related imports and event listeners
- Documented complete implementation in skills/todo.md for future work

The dependency installation system was causing unwanted loading states
when configuring skills. All functionality has been properly reverted
while preserving implementation details for future development.

* Refactor SkillManagementPanel to conditionally show action buttons based on connection status

- Added offline and setup-required states with informative messages
- Updated SkillSetupModal to use connection status for setup vs. manage mode
- Simplified mode logic for better UX and error handling in setup scenarios

* Update CLAUDE.md with new features, state slices, and code quality tools

- Document additions: Redux aiSlice, skillsSlice, teamSlice, and architecture updates
- Add ESLint, Prettier integrations with Husky hooks and GitHub workflows
- Update development commands from npm to yarn for consistency
- Expand key user groups and revise target audiences
- Include enhanced project structure, build outputs, and CI/CD updates

* fix: resolve TypeScript compilation error and enhance skill session synchronization

- Fix unused parameter error in SkillManager.getSkillLoadParams() by prefixing with underscore
- Add support for session parameter passing in SkillRuntime.load() method
- Implement skill reloading capability for post-authentication updates
- Ensure proper connection status synchronization between skill setup and UI display

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: change skill button text from 'Configure' to 'Manage' for connected skills

- Update SkillsGrid button text to dynamically show based on connection status
- Connected skills now show 'Manage' button instead of 'Configure'
- Provides clearer user indication of skill state
- Improves UX for authenticated skills like Telegram

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: update documentation, download system and code formatting improvements

- Update Claude rules with improved project overview and command documentation
- Enhance download screen with better architecture detection and formatting
- Improve device detection utilities with multi-architecture support
- Add skills system troubleshooting documentation
- Code formatting improvements with better line breaks and spacing
- Optimize GitHub release asset parsing for platform-specific downloads

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Steven Enamakel <31011319+senamakel@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Cyrus Gray
2026-02-03 05:35:54 +05:30
committed by GitHub
co-authored by Claude Steven Enamakel github-actions[bot] <github-actions[bot]@users.noreply.github.com>
parent 9d7472131f
commit 9b3dfd0c2d
14 changed files with 549 additions and 160 deletions
+32 -7
View File
@@ -141,7 +141,9 @@ export function detectPlatform(): PlatformInfo {
* Fetch the latest release from GitHub
*/
export async function fetchLatestRelease(): Promise<GitHubRelease> {
const response = await fetch('https://api.github.com/repos/alphahumanxyz/alphahuman/releases/latest');
const response = await fetch(
'https://api.github.com/repos/alphahumanxyz/alphahuman/releases/latest'
);
if (!response.ok) {
throw new Error(`Failed to fetch release: ${response.statusText}`);
}
@@ -185,7 +187,9 @@ export function getArchitectureDisplayName(arch: Architecture): string {
/**
* Parse GitHub release assets and map them to platforms with architecture support
*/
export function parseReleaseAssetsByArchitecture(assets: GitHubReleaseAsset[]): PlatformArchitectureLinks {
export function parseReleaseAssetsByArchitecture(
assets: GitHubReleaseAsset[]
): PlatformArchitectureLinks {
const links: PlatformArchitectureLinks = {};
// Use Maps to track unique architectures per platform
@@ -212,21 +216,39 @@ export function parseReleaseAssetsByArchitecture(assets: GitHubReleaseAsset[]):
};
// Windows: .exe, .msi, .zip (Windows)
if (name.includes('windows') || name.includes('.exe') || name.includes('.msi') || (name.includes('.zip') && !name.includes('macos'))) {
if (
name.includes('windows') ||
name.includes('.exe') ||
name.includes('.msi') ||
(name.includes('.zip') && !name.includes('macos'))
) {
// Only add if this architecture doesn't exist yet, or prefer more specific filenames
if (!windowsMap.has(architecture) || (name.includes('windows') && !windowsMap.get(architecture)?.fileName.toLowerCase().includes('windows'))) {
if (
!windowsMap.has(architecture) ||
(name.includes('windows') &&
!windowsMap.get(architecture)?.fileName.toLowerCase().includes('windows'))
) {
windowsMap.set(architecture, link);
}
}
// macOS: .dmg
else if (name.includes('macos') || name.includes('.dmg') || name.includes('darwin')) {
// Only add if this architecture doesn't exist yet, or prefer more specific filenames
if (!macosMap.has(architecture) || (name.includes('macos') && !macosMap.get(architecture)?.fileName.toLowerCase().includes('macos'))) {
if (
!macosMap.has(architecture) ||
(name.includes('macos') &&
!macosMap.get(architecture)?.fileName.toLowerCase().includes('macos'))
) {
macosMap.set(architecture, link);
}
}
// Linux: .AppImage, .deb, .rpm
else if (name.includes('linux') || name.includes('.appimage') || name.includes('.deb') || name.includes('.rpm')) {
else if (
name.includes('linux') ||
name.includes('.appimage') ||
name.includes('.deb') ||
name.includes('.rpm')
) {
// Prefer AppImage, then deb, then rpm for the same architecture
const existing = linuxMap.get(architecture);
if (!existing) {
@@ -267,7 +289,10 @@ export function parseReleaseAssetsByArchitecture(assets: GitHubReleaseAsset[]):
}
// Sort architectures: prefer detected architecture, then x64, then aarch64
const sortArchitectures = (archLinks: ArchitectureDownloadLink[], preferredArch?: Architecture) => {
const sortArchitectures = (
archLinks: ArchitectureDownloadLink[],
preferredArch?: Architecture
) => {
return archLinks.sort((a, b) => {
if (preferredArch && a.architecture === preferredArch) return -1;
if (preferredArch && b.architecture === preferredArch) return 1;