Title: feat: `allagents skill update` for per-skill refresh (separate from workspace sync) · Issue #375 · EntityProcess/allagents · GitHub
Open Graph Title: feat: `allagents skill update` for per-skill refresh (separate from workspace sync) · Issue #375 · EntityProcess/allagents
X Title: feat: `allagents skill update` for per-skill refresh (separate from workspace sync) · Issue #375 · EntityProcess/allagents
Description: Priority: medium · Depends on content-hash tracking issue for `--dry-run` to be meaningful. Problem The verb `allagents update` is the workspace sync command (`syncCmd` in `src/cli/commands/workspace.ts`). There is no per-skill update ve...
Open Graph Description: Priority: medium · Depends on content-hash tracking issue for `--dry-run` to be meaningful. Problem The verb `allagents update` is the workspace sync command (`syncCmd` in `src/cli/commands/workspa...
X Description: Priority: medium · Depends on content-hash tracking issue for `--dry-run` to be meaningful. Problem The verb `allagents update` is the workspace sync command (`syncCmd` in `src/cli/commands/workspa...
Opengraph URL: https://github.com/EntityProcess/allagents/issues/375
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"feat: `allagents skill update` for per-skill refresh (separate from workspace sync)","articleBody":"\u003e **Priority:** medium · Depends on content-hash tracking issue for \\`--dry-run\\` to be meaningful.\n\n## Problem\n\nThe verb \\`allagents update\\` is the *workspace sync* command (\\`syncCmd\\` in \\`src/cli/commands/workspace.ts\\`). There is no per-skill update verb. To refresh a single skill today the user re-runs the global workspace sync, which is heavier than needed and provides no dry-run / drift report.\n\n\\`gh skill update [skill...]\\` covers exactly this gap: refresh installed skills by comparing recorded tree SHAs against the remote, with \\`--all\\`, \\`--force\\`, \\`--dry-run\\`, and \\`--unpin\\` flags. Reference: \\`cli/cli\\` \\`pkg/cmd/skills/update/update.go\\`.\n\n## Current behavior\n\n\\`\\`\\`bash\n$ allagents skill update # or \\\"skills update\\\"\nerror: found 1 error\n skill update\n ^ Unknown arguments\n\n# Only workspace sync, which re-evaluates everything:\n$ allagents update\nSyncing plugins...\n\\`\\`\\`\n\n## Expected behavior\n\n\\`\\`\\`bash\n# Refresh all installed skills (TTY: prompts per drift; non-TTY: skips drift-with-no-pin)\n$ allagents skill update\nChecking 3 skills...\n✓ brainstorming up to date\n↑ git-commit v0.1.0 → v0.2.0 (updated)\n- code-review pinned to v1.0.0, skipping\n\n# Refresh one named skill\n$ allagents skill update brainstorming\n\n# Apply all without prompting\n$ allagents skill update --all\n\n# Report drift only (read-only; no file writes)\n$ allagents skill update --dry-run\nChecking 3 skills...\n- brainstorming up to date\n* git-commit v0.1.0 → v0.2.0 (would update)\n- code-review pinned to v1.0.0, skipping\n2 up to date, 1 update available, 0 pinned\n\n# Force re-download even when hashes match\n$ allagents skill update --force --all\n\n# Clear pin and move to latest\n$ allagents skill update git-commit --unpin\n\\`\\`\\`\n\nJSON mode emits the standard envelope with per-skill state:\n\n\\`\\`\\`bash\n$ allagents --json skill update --dry-run\n{\n \\\"success\\\": true,\n \\\"command\\\": \\\"skill update\\\",\n \\\"data\\\": {\n \\\"checked\\\": 3,\n \\\"updates\\\": [\n { \\\"skill\\\": \\\"git-commit\\\", \\\"source\\\": \\\"owner/repo\\\",\n \\\"from\\\": \\\"v0.1.0\\\", \\\"to\\\": \\\"v0.2.0\\\", \\\"status\\\": \\\"available\\\" }\n ],\n \\\"upToDate\\\": [\\\"brainstorming\\\"],\n \\\"pinned\\\": [\\\"code-review\\\"]\n }\n}\n\\`\\`\\`\n\n## Verification gate (must pass before closing)\n\n\\`\\`\\`bash\nset -euo pipefail\nbun run build\nWS=\\$(mktemp -d)\ncd \\\"\\$WS\\\"\nallagents workspace init --client claude\n\n# Install one skill at a known older version\nallagents skills add brainstorming --from anthropics/superpowers --pin v0.1.0\n\n# (1) Dry-run does not mutate anything\nSNAPSHOT_BEFORE=\\$(find .claude .agents .allagents -type f -exec sha256sum {} + 2\u003e/dev/null | sort | sha256sum)\nallagents skill update --dry-run \u003e/dev/null\nSNAPSHOT_AFTER=\\$(find .claude .agents .allagents -type f -exec sha256sum {} + 2\u003e/dev/null | sort | sha256sum)\n[ \\\"\\$SNAPSHOT_BEFORE\\\" = \\\"\\$SNAPSHOT_AFTER\\\" ]\n\n# (2) JSON envelope shape is correct in dry-run mode\nallagents --json skill update --dry-run | jq -e '.command == \\\"skill update\\\"'\nallagents --json skill update --dry-run | jq -e '.data | has(\\\"upToDate\\\") and has(\\\"updates\\\") and has(\\\"pinned\\\")'\n\n# (3) --all applies without prompting (no TTY; depends on default behavior in non-interactive mode)\nallagents skill update --all \u003e/dev/null\n\n# (4) Pinned skill is skipped unless --unpin\nallagents --json skill update --all | jq -e '.data.pinned | length \u003e= 1 or .data.updates | length \u003e= 0' # pinned listed\nallagents skill update brainstorming --unpin --all\njq -e '.sources[\\\"anthropics/superpowers\\\"].pinnedRef == null or (.sources[\\\"anthropics/superpowers\\\"] | has(\\\"pinnedRef\\\") | not)' .allagents/sync-state.json\n\n# (5) --force re-downloads even when hashes match — verify the file mtime changes\nHASH_BEFORE=\\$(jq -r '.sources[\\\"anthropics/superpowers\\\"].skills.brainstorming.contentHash' .allagents/sync-state.json)\nallagents skill update --force --all\nHASH_AFTER=\\$(jq -r '.sources[\\\"anthropics/superpowers\\\"].skills.brainstorming.contentHash' .allagents/sync-state.json)\n[ \\\"\\$HASH_BEFORE\\\" = \\\"\\$HASH_AFTER\\\" ] # content same, but updatedAt should have moved\njq -e '.sources[\\\"anthropics/superpowers\\\"].skills.brainstorming.updatedAt' .allagents/sync-state.json\n\n# (6) Non-interactive without --all: skill update behaves predictably (does not block on a prompt)\ntimeout 10 allagents skill update \u003c/dev/null\n\ncd / \u0026\u0026 rm -rf \\\"\\$WS\\\"\n\\`\\`\\`\n\nAll six checks must pass.\n\n## Implementation notes\n\n- Add \\`updateCmd\\` to \\`src/cli/commands/plugin-skills.ts::skillsCmd\\` with flags \\`--all\\`, \\`--force\\`, \\`--dry-run\\`, \\`--unpin\\`, and an optional positional skill name (\\`cmd-ts\\` \\`positional({ type: optional(string) })\\`).\n- Drift detection requires the \\`sources\\` block from the companion content-hashes issue. Without it, \\`--dry-run\\` collapses into a no-op.\n- Non-TTY default behavior: skip skills that would prompt (mirrors current \\`isJsonMode()\\` gating). Document this in the meta's \\`whenToUse\\`.\n- Walk every known agent-host directory at both scopes to find installed skills (don't require a single workspace.yaml — the skill might have been added at user scope). \\`gh skill\\`'s reference impl does the same in \\`pkg/cmd/skills/update/update.go::scanInstalledSkills\\`.\n- For \\`--unpin\\`: clear \\`pinnedRef\\` in sync-state before resolving, then resolve to latest. Equivalent to running install with no \\`--pin\\`.\n- Add a corresponding meta in \\`src/cli/metadata/plugin-skills.ts\\` and add it to \\`allCommands\\` in \\`src/cli/agent-help.ts\\` (this is also covered by the agent-help bug issue — coordinate).\n\n## Refs\n\n- Reference impl: \\`cli/cli\\` \\`pkg/cmd/skills/update/update.go\\`.\n- Companion wiki page: \\`concepts/allagents-vs-gh-skill.md\\` § \\\"Update semantics\\\".\n- Depends on: content-hash tracking issue.\n- Related: version pinning issue (defines \\`pinnedRef\\`).","author":{"url":"https://github.com/christso","@type":"Person","name":"christso"},"datePublished":"2026-05-12T10:57:49.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},"url":"https://github.com/375/allagents/issues/375"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:c9e96be5-7bb0-8554-9819-7628b868cb6d |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E8D8:DF303:7FE5FF:B9EB0D:6A4E1230 |
| html-safe-nonce | 708022e78f4a3edbd357b04f29c166550d1945b961d05c2f339012c86322c763 |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFOEQ4OkRGMzAzOjdGRTVGRjpCOUVCMEQ6NkE0RTEyMzAiLCJ2aXNpdG9yX2lkIjoiMjU5OTY3MTA3Mzg2MDM1ODcwNCIsInJlZ2lvbl9lZGdlIjoiaWFkIiwicmVnaW9uX3JlbmRlciI6ImlhZCJ9 |
| visitor-hmac | 1b17a8ef5a5cfefc0e09eeb47a24a2b5cdb85daf790bbc6d056dcebc451310b5 |
| hovercard-subject-tag | issue:4428489180 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/EntityProcess/allagents/375/issue_layout |
| twitter:image | https://opengraph.githubassets.com/00217bf1bb4cbdec2292765c3bfa0146866e985e3f98851ec7c3cbe06dc8c6bc/EntityProcess/allagents/issues/375 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/00217bf1bb4cbdec2292765c3bfa0146866e985e3f98851ec7c3cbe06dc8c6bc/EntityProcess/allagents/issues/375 |
| og:image:alt | Priority: medium · Depends on content-hash tracking issue for `--dry-run` to be meaningful. Problem The verb `allagents update` is the workspace sync command (`syncCmd` in `src/cli/commands/workspa... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | christso |
| hostname | github.com |
| expected-hostname | github.com |
| None | 030096ee0db095447bfe77409d33bfac127ca7128299c58deef27c52eaa1b1f0 |
| turbo-cache-control | no-preview |
| go-import | github.com/EntityProcess/allagents git https://github.com/EntityProcess/allagents.git |
| octolytics-dimension-user_id | 8837957 |
| octolytics-dimension-user_login | EntityProcess |
| octolytics-dimension-repository_id | 1139437609 |
| octolytics-dimension-repository_nwo | EntityProcess/allagents |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1139437609 |
| octolytics-dimension-repository_network_root_nwo | EntityProcess/allagents |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | ea9187571e3edc5f2780f750631138669441ca50 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width