mirror of
https://github.com/stablyai/orca.git
synced 2026-11-05 19:47:27 +00:00
* Add Orca's own bundled-skill planner and installer (not wired in yet) One planner decides what installing Orca's bundled skills does to each target folder; execute re-plans under per-path locks and runs only a plan whose digest still matches; a shared summary derives badge, wording and exit code. A copy counts as Orca's untouched one only when its SKILL.md bytes match a version some build shipped (resources/skills/released-digests.json, generated from git history and checked add-only). Nothing calls this yet; the npx path is unchanged. * Report left-alone folders as warnings and keep backups in the home A leave is no longer a failure: the outcome line says what happened plus "N left alone: <reason>", and the exit code is 1 only for a failed or changed op. Backups for every scope go to <home>/.agents/.orca-skill-backups on the executing host, so a project Replace never writes into the repo; moving there falls back to copy, verify, then remove across filesystems. * Update Orca's skills with Orca's own installer instead of npx skills The app's Update skills dialog, badge, nudge and status pills now read the bundled-skill plan and summary, and Update executes the reviewed plan's digest. `orca skills install|update` runs the same planner in-process with --dry-run, --force, --json and per-summary exit codes. Removes both npx spawn sites, the freshness inventory modules and the npx round-trip CI. * Update only where the skill already is; one provider-root rule for app and CLI installedOnly now drops every location that holds nothing (keeping the shared slot only when an existing agent link points at it), so Update never adds a skill for another agent. The app and CLI resolve the Claude skills folder through the same rule in localBundledSkillInput; a test asserts both plan identically. * Compact Update skills dialog: one row per skill, locations named by agent summarizeBundledSkillPlan now returns each skill's locations, labelled by agent (or "Shared folder") with a ~-collapsed path; the dialog shows one row per skill that needs something, collapses up-to-date skills into one line, and lists every location behind "Show all locations". The result reads "Updated N skills · M left alone". Under installedOnly a Replace with no shared copy replaces in place instead of adding one. * fix(skills): keep location paths readable by putting the state under the path * fix(skills): hold the last plan in state, not a ref mutated during render Split the update dialog's rows, headline and footer into components, move the Update label next to the other plan copy, and use z.strictObject for the request schemas. * Escape non-ASCII characters in bundled-skill regex and wording The orcad bundle rejects a literal non-ASCII character in a regex. * fix(cli): escape non-ASCII apostrophes in the skills install help text * Plan and update Orca's skills on paired servers, SSH hosts and WSL * Show the skills pill for paired hosts; real-WSL installer test * test(orcad): check the bundled CLI plans a skill install without npx Drop the deleted roundtrip workflow's group from the closed-PR cancellation fixture. * Let the WSL installer create the backups folder itself * Review fixes: follow the active workspace's host, keep hosts' plans and runs apart, never boot WSL for a background check * test: execute requests carry the plan request; CLI pill follows the local target * Write large WSL skill files in chunks that stay under the command-line limit * Make bundled-skill test fixtures link folders the way the product does on Windows Directory links in fixtures are junctions on Windows, which need no Developer Mode; the one file-link fixture is skipped there. * Let a client ask a host to install named Orca skills, not only update installed ones * Plan an SSH workspace on the managed server that serves its host; ask to connect otherwise * Translate the remote skill states into every locale * Resolve legacy skill agent keys canonically * Reject stale skill replacements when auxiliary content changes * Remove the Windows-hosted WSL bundled skill installer * Wait for active workspace ownership before planning bundled skills * Keep ordinary bundled skill classification shallow * Leave unreadable skill replacements alone without aborting plans * Pass force-all through shallow planning and describe unreadable copies * Clarify skill update statuses and folder details * Keep selected skill replacements in place with one status * Report completed skill replacements with their backup confirmation * Clarify available skill updates and skipped copies * Keep skill update results in preview order * Show each skill skip reason once * Count skipped skills instead of skipped folders * Make installer input and link tests work on Windows * Bound bundled skill classification reads and parse names linearly * Keep workspace skill roots inside the resolved workspace * Compare workspace skill roots with native path semantics * Restrict bundled skill backups to their owner on POSIX * Keep bundled skill updates on the proven local workspace host * Keep recovered skills needing attention until they are updated * Count completed skill updates in the status tooltip * Sync the runtime localization catalog
42 lines
2.0 KiB
TypeScript
42 lines
2.0 KiB
TypeScript
export const SKILL_INSTALL_CAPABILITY = 'skills.install.v1' as const
|
|
export const SKILL_INSTALL_RESULT_V2_CAPABILITY = 'skills.install-result.v2' as const
|
|
export const SKILL_INSTALL_CANCEL_CAPABILITY = 'skills.install-cancel.v1' as const
|
|
export const SKILL_UPLOAD_CAPABILITY = 'skills.upload.v1' as const
|
|
export const SKILL_MANAGEMENT_CAPABILITY = 'skills.manage.v1' as const
|
|
export const SKILL_BUNDLE_INSTALL_CAPABILITY = 'skills.install.bundle.v1' as const
|
|
export const SKILL_INSTALL_PROGRESS_CAPABILITY = 'skills.install-progress.v1' as const
|
|
/** Why: the install request schema is strict, so a host that predates the agent
|
|
* picker rejects the whole request rather than ignoring the new field. */
|
|
export const SKILL_INSTALL_PROVIDERS_CAPABILITY = 'skills.install-providers.v1' as const
|
|
|
|
export const SKILL_INSTALL_UPDATE_REQUIRED_MESSAGE =
|
|
'Update Orca on the selected machine to install shared skills.'
|
|
|
|
/** Why capability-gated rather than Rule 1: `skills.delete` is a new RPC method,
|
|
* and an old host answers method-not-found, which surfaces as an unexplained
|
|
* failure instead of a disabled action with a reason. */
|
|
export const SKILL_DELETE_CAPABILITY = 'skills.delete.v1' as const
|
|
|
|
export const SKILL_DELETE_UPDATE_REQUIRED_MESSAGE =
|
|
'Update Orca on the selected machine to delete skills.'
|
|
|
|
/** `skills.planBundledOrca` / `skills.executeBundledOrca`; their op and reason enums are frozen
|
|
* for v1, and a client renders a value it does not know as "Needs attention". */
|
|
export const BUNDLED_ORCA_SKILL_CAPABILITY = 'skills.bundled-orca.v1' as const
|
|
|
|
export const BUNDLED_ORCA_SKILL_UPDATE_REQUIRED_MESSAGE =
|
|
'Update Orca on the server to update its Orca skills.'
|
|
|
|
export const SKILL_RUNTIME_CAPABILITIES = [
|
|
SKILL_INSTALL_CAPABILITY,
|
|
SKILL_BUNDLE_INSTALL_CAPABILITY,
|
|
SKILL_INSTALL_CANCEL_CAPABILITY,
|
|
SKILL_INSTALL_PROGRESS_CAPABILITY,
|
|
SKILL_INSTALL_RESULT_V2_CAPABILITY,
|
|
SKILL_UPLOAD_CAPABILITY,
|
|
SKILL_MANAGEMENT_CAPABILITY,
|
|
SKILL_INSTALL_PROVIDERS_CAPABILITY,
|
|
SKILL_DELETE_CAPABILITY,
|
|
BUNDLED_ORCA_SKILL_CAPABILITY
|
|
] as const
|