Commit graph

131 commits

Author SHA1 Message Date
Naiyuan Qing
9b87cd789e feat(ui): add Markdown rendering components
Add CodeBlock, Markdown, StreamingMarkdown components with
Shiki syntax highlighting, GFM support, and linkify utility.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 20:40:27 +08:00
Jiang Bohan
2a96fc9227 fix(autocomplete): Tab completes selected suggestion to input
- First Tab: highlights first suggestion
- Second Tab: completes highlighted suggestion to input with trailing space
- Use arrow keys to navigate between suggestions
2026-01-30 17:49:12 +08:00
Jiang Bohan
ce314105af docs: add custom skill creation section to README 2026-01-30 17:45:27 +08:00
Jiang Bohan
dc2c369ca9 docs(skill-creator): explicitly state no .skill packaging needed 2026-01-30 17:43:59 +08:00
Jiang Bohan
66cb3e5a93 refactor(skill-creator): use direct bash commands instead of Python script
Simplify skill creation by using mkdir + cat instead of init_skill.py
to avoid path resolution issues between bundled and managed directories
2026-01-30 17:39:52 +08:00
Jiang Bohan
f19e51da31 feat(skill-creator): add init_skill.py script for reliable skill creation
- Add init_skill.py that always creates skills in ~/.super-multica/skills/
- Restructure SKILL.md with step-by-step creation process
- Make script usage mandatory to prevent skills in wrong directories
- Support --description, --emoji, --tag, --resources options
2026-01-30 17:39:03 +08:00
Jiang Bohan
b2d281c29d docs(skill-creator): emphasize correct skill directory path 2026-01-30 17:34:35 +08:00
Jiang Bohan
5562fbe7d7 docs(skill-creator): add progressive disclosure section 2026-01-30 17:26:49 +08:00
Jiang Bohan
c1cbdacf40 feat(skills): add skill-creator meta-skill for self-extension
Add a bundled skill that teaches the agent how to create, edit, and
manage custom skills. This enables the agent to extend its own
capabilities by writing new SKILL.md files.

Features:
- Complete SKILL.md format reference
- Examples for creating translation and code formatter skills
- Best practices for skill development
- Script inclusion guidance
- Skill precedence explanation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 17:22:25 +08:00
Jiang Bohan
423bb6e5a6 docs: add language switch and update root README skills section
- Add English/Chinese language switch links to skills READMEs
- Update root README.md with new skills features and CLI examples
- Link to full skills documentation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 17:10:01 +08:00
Bohan Jiang
20b45c0bcf
Merge pull request #36 from multica-ai/feat/skills-system
feat(skills): complete skills system implementation
2026-01-30 17:07:12 +08:00
Jiang Bohan
8974f52669 docs(skills): add plugin system docs and Chinese translation
- Document plugin system in Loading & Precedence section
- Add guidance on when to use plugins vs `add` command
- Create README.zh-CN.md with full Chinese translation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 17:03:39 +08:00
Jiang Bohan
8c2f8add76 feat(skills): add plugin system for npm package discovery
- Add plugin.ts with manifest loading and plugin discovery
- Scan node_modules for packages with multica.plugin.json
- Auto-discover and load skills from installed npm packages
- Integrate plugin skills into SkillManager via loader.ts
- Add workspaceDir and pluginPaths options to SkillManagerOptions
- Export plugin types and functions from index.ts

This enables users to install skill packages via npm and have them
automatically discovered without running `skills add`.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:48:36 +08:00
Jiang Bohan
a07e3ae280 docs(skills): add documentation for diagnostics and serialization
Document new Phase 5 features:
- Status diagnostics with diagnostic types table
- Async serialization API and utilities
- Updated troubleshooting section

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:23 +08:00
Jiang Bohan
3f1566694d chore(skills): export new diagnostics and serialize modules
Export checkEligibilityDetailed, DiagnosticItem, serialize, and
related utilities from skills index.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:19 +08:00
Jiang Bohan
7ddf4f76a3 refactor(skills): add serialization to add/remove/install operations
Apply async serialization to prevent concurrent operations:
- addSkill: serialized by target skill name
- removeSkill: serialized by skill name
- installSkill: serialized by skill ID

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:14 +08:00
Jiang Bohan
ac7c124109 feat(cli): enhance status command with rich diagnostics
Improve skills:cli status command with:
- Summary view grouping ineligible skills by issue type
- Detailed view showing requirements checklist and diagnostics
- Color-coded output for better readability
- Quick actions section with actionable hints
- Support for verbose mode (-v) for additional details

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:10 +08:00
Jiang Bohan
deb96496e7 feat(skills): add detailed eligibility diagnostics with hints
Enhance eligibility checking to provide detailed diagnostics including:
- Diagnostic type categorization (binary, env, platform, config)
- Actionable hints for resolving issues
- Platform-specific install suggestions for common tools
- API key source hints for well-known services

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:06 +08:00
Jiang Bohan
3bd85b63a4 feat(skills): add async serialization for concurrent operations
Add serialize module to prevent concurrent operations from corrupting
files when multiple add/remove/install operations run simultaneously.

- Queue-based serialization by key
- Utility functions: isProcessing, getQueueLength, waitForKey, waitForAll
- Standard SerializeKeys for common operations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:33:01 +08:00
Jiang Bohan
84f5c69b10 feat(cli): add real-time autocomplete dropdown for commands
Implement autocomplete input with visual dropdown suggestions:
- Shows matching commands as you type /
- Use arrow keys or Tab to navigate suggestions
- Enter to select, Escape to dismiss
- Displays command descriptions alongside names

No external dependencies - uses raw terminal control codes.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:20:17 +08:00
Jiang Bohan
40b680266a docs(skills): add skill invocation documentation
Document Phase 4 skill invocation features:
- User invocation via slash commands
- Tab completion usage
- Invocation control frontmatter fields
- Command dispatch configuration
- Command name normalization rules

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:11:23 +08:00
Jiang Bohan
ac6f8fb493 feat(cli): add tab completion for skill commands
Integrate SkillManager with interactive CLI:
- Tab completion for /command prefixes
- Combined completion for built-in and skill commands
- Skill invocation handling with instructions context
- Updated /help to display available skill commands

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:11:19 +08:00
Jiang Bohan
4e10ee7e15 feat(skills): extend SkillManager with invocation methods
Add invocation capabilities to SkillManager:
- getSkillCommands: get user-invocable skill command specs
- resolveCommand: match user input to skill invocation
- getCompletions: get tab completions for command prefix
- buildModelSkillsPrompt: build prompt excluding user-only skills

Export invoke module functions for external use.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:11:13 +08:00
Jiang Bohan
42e2943999 feat(skills): add invoke module for skill commands
Implement skill command invocation system:
- resolveInvocationPolicy: get skill's invocation settings
- isUserInvocable/isModelInvocable: check invocation eligibility
- sanitizeCommandName: normalize skill names for commands
- buildSkillCommands: generate command specs from skills
- findSkillCommand: match command by name or skill ID
- resolveSkillInvocation: parse user input to skill invocation
- getCommandCompletions: tab completion for skill commands

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:11:07 +08:00
Jiang Bohan
8fbd72c329 feat(skills): add invocation types and parser support
Add types for skill invocation control:
- SkillInvocationPolicy for user-invocable/model-invocable flags
- SkillCommandSpec for command specifications
- SkillCommandDispatch for tool dispatch configuration
- SkillInvocationResult for resolved command results

Update parser to handle frontmatter fields:
- user-invocable (kebab-case, camelCase, snake_case)
- disable-model-invocation
- command-dispatch, command-tool, command-arg-mode

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:10:59 +08:00
LinYushen
916223db6f
Merge pull request #34 from multica-ai/copy-env-local
refactor(hub): rename Device ID to Hub ID in console layer
2026-01-30 16:10:16 +08:00
yushen
eb4ce85602 refactor(hub): rename Device ID to Hub ID in console layer
Rename the business-layer concept from "Device ID" to "Hub ID" for
better user comprehension. The underlying network transport layer
still uses deviceId — Hub ID is passed as the deviceId value.

- Rename device.ts → hub-identity.ts, getDeviceId → getHubId
- Storage file: ~/.super-multica/device-id → ~/.super-multica/hub-id
- Hub property: deviceId → hubId
- API response field: deviceId → hubId
- Console UI label: "Device ID" → "Hub ID"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 16:02:00 +08:00
Jiayuan
a3e9fb60eb
Merge pull request #32 from multica-ai/forrestchang/cli-build-bin
feat(cli): add binary build support
2026-01-30 15:58:40 +08:00
Jiang Bohan
578c8a6534 docs(skills): add README for skills system 2026-01-30 15:53:55 +08:00
LinYushen
b66bbdde06
Merge pull request #33 from multica-ai/fix/openrouter-provider
fix(agent): add OpenRouter provider support
2026-01-30 15:51:27 +08:00
yushen
b8201293b6 fix(agent): add OpenRouter provider support and guard against unknown models
Use generic OPENROUTER_* env vars (OPENROUTER_API_KEY, OPENROUTER_BASE_URL,
OPENROUTER_MODEL) via the existing fallback mechanism instead of hardcoding
mappings to OPENAI_* vars. Also add a guard when resolveModel returns
undefined to throw a clear error instead of crashing on property access.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:50:49 +08:00
Jiang Bohan
da3bb254ec fix(skills): support nested skill directories and managed skills
- Add managed skills directory (~/.super-multica/skills/) to loader
- Change discoverSkillDirs to recursively scan up to 3 levels deep
- Skip hidden directories during scan
- Fixes skills installed via `skills add` not being discovered

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:36:31 +08:00
Jiang Bohan
ecaada1df0 feat(skills): add CLI commands for add/remove skills
Add new CLI commands:
- add <source>: Add skill from GitHub (owner/repo format)
- remove <name>: Remove installed skill
- Support for --force flag to overwrite existing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:30:00 +08:00
Jiang Bohan
aee807e95a feat(skills): add module for GitHub skill installation
Implement skill download from GitHub repositories:
- parseSource() to handle owner/repo, owner/repo/skill, and full URLs
- addSkill() with shallow clone and sparse checkout support
- removeSkill() to uninstall skills
- listInstalledSkills() for listing managed skills
- Automatic .git cleanup after clone

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:29:55 +08:00
Jiayuan
7f25378e4b feat(cli): add binary build support for interactive CLI
Add esbuild-based build script to bundle CLI tools into standalone
binaries that can be run directly with node. The built binaries
externalize dependencies to keep bundle size small and avoid
bundling issues with native modules.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:22:53 +08:00
Jiang Bohan
1105a7ac1f feat(skills): add CLI for skills management
Add skills-cli.ts with commands:
- list: Show all skills with eligibility status
- status [id]: Show detailed skill info or summary
- install <id>: Install skill dependencies

Add skills:cli script to package.json

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:15:56 +08:00
Jiang Bohan
91709ddd84 feat(skills): integrate watcher into SkillManager
Add hot reload support to SkillManager:
- startWatching/stopWatching methods
- Version-based automatic cache invalidation
- Export install and watcher functions
- listAllSkillsWithStatus and checkSkillEligibility helpers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:15:51 +08:00
Jiang Bohan
8eba6c0f4a feat(skills): add file watcher for hot reload
Implement chokidar-based file watching for skill hot reload:
- Version-based cache invalidation
- Debounced change detection
- Change listener registration with onSkillsChange
- Dynamic chokidar import (optional dependency)
- Watch skill directories with configurable paths

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:15:46 +08:00
Jiang Bohan
5853c9146a feat(skills): add install mechanism for skill dependencies
Implement install support for brew/npm/uv/go/download methods:
- buildInstallCommand for each installer type
- selectPreferredInstallSpec with configurable priority
- installSkill main function with timeout support
- Download support with archive extraction (tar.gz, zip)
- getInstallOptions for UI listing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:15:41 +08:00
Jiang Bohan
6d0ee87fdf test(skills): update eligibility tests for new context-based API
- Update checkEligibility calls to use EligibilityContext object
- Add tests for new features: anyBins, always flag, config disabled
- Add tests for bundled allowlist filtering
- Add tests for env var injection via config
- Add tests for apiKey + primaryEnv combination
- Add tests for new requires.bins/env format alongside legacy format

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:01:50 +08:00
Jiang Bohan
3d2e539127 feat(agent): integrate skills config into AgentOptions
- Add skills?: SkillsConfig to AgentOptions
- Update runner.ts to pass skills config to SkillManager
- Merge extraSkillDirs from options with config.load.extraDirs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:01:44 +08:00
Jiang Bohan
00915d7fb9 feat(skills): enhance metadata and config system for OpenClaw compatibility
- Add SkillInstallSpec type for future install mechanism support
- Add SkillRequirements type with bins, anyBins, env, config checks
- Add SkillConfig, SkillsConfig types for per-skill and global config
- Add utility functions: getSkillKey, getSkillConfig, normalizeRequirements
- Support both new (requires.bins, os) and legacy (requiresBinaries, platforms) fields
- Implement 'always' flag to skip eligibility checks
- Implement bundled skills allowlist filtering
- Implement config-based skill enable/disable
- Implement env var injection via config (apiKey + primaryEnv)
- Add listAllSkillsWithStatus() method to SkillManager
- Export new types and utility functions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 15:01:35 +08:00
LinYushen
4f50b3b399
Merge pull request #31 from multica-ai/copy-env-file
feat(gateway): add PWA mobile client
2026-01-30 15:00:59 +08:00
yushen
f3ec056b90 feat(console): redesign Hub Console UI for desktop
- Stat cards grid (Device ID, Gateway, State, Agents) with copy buttons
- Connection state badge with colored dot indicator
- Inline gateway URL form with accent Connect button
- Agent table with hover-reveal copy and delete actions
- Toast notification on clipboard copy
- Centered container layout (960px max)
- Consistent dark theme matching Multica Client branding

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:59:00 +08:00
yushen
d9ba793fee fix(gateway): extract content from payload in received messages
Display payload.content instead of raw JSON when the payload
is an object with a content field.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:46:30 +08:00
yushen
7775ba5ca9 fix(gateway): stack target fields vertically for mobile
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:43:22 +08:00
yushen
e35aa95690 chore(gateway): rename client from Geneva to Multica
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:41:48 +08:00
yushen
25d447afc6 feat(gateway): polish PWA client UI for mobile
- Move disconnect button into header as a compact X icon
- Add app logo to header and setup screen
- Truncate device ID with tap-to-copy
- Collapsible target bar with smart label summary
- Empty state illustration when no messages
- Pulsing status dot animation for live connection
- Rounded send button, chat-bubble message input
- Glassmorphism header/compose bar with backdrop blur
- Auto-open target bar when targets not set
- Auto-collapse target bar after first send

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:39:31 +08:00
yushen
0f8db7083c fix(gateway): serve PWA client under /client subpath
Move static files from / to /client to avoid conflicts with
WebSocket and existing HTTP endpoints. Update manifest, service
worker, and HTML asset references accordingly.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:35:40 +08:00
yushen
5f2cc06111 fix(gateway): fix Dockerfile build and copy static assets
- Replace `pnpm build` (turbo recursion) with direct `tsc` invocation
- Copy gateway/public static assets into dist for PWA serving

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 14:32:01 +08:00