Skip to content

v0.19.0#126

Merged
runkids merged 205 commits intomainfrom
feat/agents
Apr 11, 2026
Merged

v0.19.0#126
runkids merged 205 commits intomainfrom
feat/agents

Conversation

@runkids
Copy link
Copy Markdown
Owner

@runkids runkids commented Apr 10, 2026

  1. Agent management — agents are a first-class resource type alongside skills. Install, sync, audit, update, uninstall, and back them up with the same workflow
  2. Positional kind filterskillshare sync agents, skillshare audit agents, and so on. Commands default to skills when no keyword is given (existing behavior unchanged)
  3. Agent auto-detectioninstall detects agents in agents/ subdirectories, mixed-kind repos, and pure-agent repos. Tracked agent repos are supported with git-pull updates
  4. Unified Web UI Resources — the old /skills page is now /resources with Skills and Agents tabs. Targets, Update, Filter Studio, and Audit pages all support both kinds
  5. Centralized .metadata.json — a single metadata file replaces the old registry.yaml + per-skill sidecar files, with automatic migration on first load. Fixes long-standing nested-name collisions
  6. Theme system — light/dark terminal palette with SKILLSHARE_THEME, WCAG-AA-compliant light colours, OSC 11 auto-detection
  7. Audit --all flag removed — superseded by the positional kind filter (audit agents)

runkids added 30 commits April 7, 2026 18:05
…mentations, and reserved name validation

Create internal/resource/ package with:
- kind.go: ResourceKind interface (Discover, ResolveName, FlatName,
  CreateLink, feature gates) + DiscoveredResource struct
- skill.go: SkillKind — directory-based discovery via SKILL.md,
  frontmatter name resolution, nested separator flatten (a/b → a__b)
- agent.go: AgentKind — single-file .md discovery with conventional
  excludes (README/LICENSE/CHANGELOG/SKILL.md), filename-based naming
  with frontmatter override, directory-strip flatten (dir/f.md → f.md)

Add "agents" to reservedSkillNames in validate.SkillName() to prevent
skill names conflicting with the agents source directory.

16 unit tests covering discovery, nested paths, name resolution,
flat name computation, feature gates, and edge cases.
…init

Add AgentsSource field to Config struct with EffectiveAgentsSource()
method that defaults to ~/.config/skillshare/agents when not set.

Global init now creates agents source directory alongside skills source.
Project init creates .skillshare/agents/ alongside .skillshare/skills/.
projectRuntime gains agentsSourcePath field for project-mode agent ops.

Update config.schema.json with agents_source property definition.
…d registry load/save

Rename SkillEntry to ResourceEntry with type alias for backward compat.
All 56 call sites continue to compile without changes.

Add LoadUnifiedRegistry() to merge separate skills and agents registry
files for global mode (skills/registry.yaml + agents/registry.yaml).
Agent entries automatically get Kind="agent" during merge.

Add SaveSplitByKind() to split a unified registry back by kind for
persisting to the correct source directory. Skips writing agents
registry file when no agent entries exist.
Add SyncAgents() dispatcher supporting all three sync modes:
- merge: per-file symlinks with local file preservation
- symlink: whole directory symlink to agent source
- copy: file copy with content-diff detection

Add CheckAgentCollisions() to detect agents that flatten to the same
filename from different subdirectories.

Add PruneOrphanAgentLinks() for merge mode and PruneOrphanAgentCopies()
for copy mode to clean up stale agent files in targets.

Add CollectAgents() to copy non-symlinked .md files from target back
to agent source directory.

18 tests covering all modes, collision detection, pruning, and collect.
…flags

Extend DiscoveryResult with Agents field and auto-detection rules:
- agents/ convention directory scanned for .md files
- pure agent repo fallback (no SKILL.md, no agents/ dir, root .md files)
- conventional excludes (README/LICENSE/CHANGELOG/SKILL.md)

Add InstallAgentFromDiscovery() for single-file agent install with
per-agent metadata (<name>.skillshare-meta.json with kind: agent).

Add Kind field to SkillMeta and InstallOptions. New CLI flags:
- --kind <skill|agent>: explicit resource kind selection
- --agent/-a <names>: select specific agents (implies --kind agent)

Add AgentInfo struct, DiscoveryResult helper methods (HasAgents,
HasSkills, IsMixed), and InstallOptions helpers (IsAgentMode,
HasAgentFilter).
Add CheckAgents() in internal/check/ that scans agents source directory,
reads per-agent metadata (<name>.skillshare-meta.json), and compares
file hashes to detect drift. Statuses: up_to_date, drifted, local, error.

Add agent trash functions in internal/trash/:
- AgentTrashDir() / ProjectAgentTrashDir() for agent-specific trash paths
- MoveAgentToTrash() moves agent .md file + metadata to timestamped
  trash subdirectory with rename-or-copy-then-delete fallback

6 unit tests for agent check covering empty dir, local agent, hash
match, drift detection, nonexistent dir, and non-md filtering.
Add kind_filter.go with two parsing strategies:
- parseKindArg(): positional syntax (list agents, sync skills)
- parseKindFlag(): flag syntax (uninstall --kind agent tutor)

resourceKindFilter type with IncludesSkills()/IncludesAgents() helpers
for handler-level routing. Supports singular and plural forms
(skill/skills, agent/agents).

16 test cases covering both parsers and filter logic.
Add ReadAgentIgnoreMatcher() in skillignore package to read .agentignore
and .agentignore.local files using the same gitignore-style pattern
format as .skillignore.

Integrate .agentignore filtering into AgentKind.Discover() with both
directory-level CanSkipDir() and file-level Match() checks.

Add agent validation in internal/validate/:
- AgentFile(): extension check, filename restrictions (no spaces/special
  chars), file size warning (>100KB), existence and type checks
- AgentName(): name format validation (alphanumeric + hyphens/underscores)

9 new tests across resource and validate packages.
Add agentsSource() helper to Server for mode-aware agent directory
resolution (global: EffectiveAgentsSource, project: .skillshare/agents).

handler_overview: add agentCount field counting .md files in agents dir.

handler_skills: add kind field ("skill"/"agent") to skillItem response.
Support ?kind= query param filter. List agents from agents source dir
alongside skills, with metadata enrichment from per-agent meta files.

handler_targets: add agentPath, agentLinkedCount, agentExpectedCount
fields to targetItem for frontend agent path display.
Update TypeScript types to match backend agent support:
- Skill: add kind field ('skill' | 'agent')
- Overview: add agentCount field
- Target: add agentPath, agentLinkedCount, agentExpectedCount
- AuditFinding: add optional kind field
- TrashedSkill: add optional kind field

Update listSkills() to accept optional kind filter param (?kind=agent).

Add KindBadge component rendering [S] (info) or [A] (accent) badges
using the existing Badge component.
status: show agents source path and agent count alongside skills source.

doctor: add checkAgentsSource() health check verifying agents source
directory exists, is a directory, and reports agent count. Non-existent
dir is info (not error) since agents are optional.

handler_trash: add kind field to trashItemJSON for frontend badge.
…PI handlers

DashboardPage: add Agents stat card with Bot icon and accent color,
linking to /skills?kind=agent.

SkillsPage: add Skills/Agents filter tabs alongside existing filters.
KindBadge displayed on each skill card. matchFilter supports kind-based
filtering with accurate filter counts.

handler_collect: add kind field to localSkillItem response.
handler_uninstall: add kind field to batch request and result structs.
enable.go: support --kind agent flag to route enable/disable operations
to .agentignore instead of .skillignore. Works in both global and project
modes. Oplog entries now include kind field.

TargetsPage.tsx: show agent path below skill path when target has
agentPath. Display agent linked count alongside skill counts.
handler_skills: skill detail endpoint falls back to agents source when
skill not found. Returns agent .md file content and kind='agent'.

project_reconcile: add ReconcileProjectAgents() to scan agents source,
update registry with kind='agent' entries, and batch-update
.skillshare/.gitignore for agent files and metadata.

TrashPage: add KindBadge next to trashed item names with 'skill'
fallback for old trash items without kind field.
SkillDetailPage: import KindBadge, show kind badge (S/A) next to skill
name in the detail header.

audit: add parseKindArg() for 'skillshare audit agents' syntax. Kind
filter parsing ready, actual agent-only filtering to be wired.
check: add parseKindArg() for 'skillshare check agents'. When agents
kind selected, runs CheckAgents() on agents source dir and displays
per-agent status (up_to_date/drifted/local/error). Supports --json.

uninstall: add --kind flag to parseUninstallArgs and parseKindFlag()
in cmdUninstall dispatch. Kind stored in uninstallOptions for
agent-specific uninstall routing.
When 'skillshare audit agents' is used, override sourcePath to agents
source directory so auditInstalled() scans agent .md files.
update: add parseKindArg() for 'skillshare update agents' syntax.

diff: add Kind field to diffJSONItem struct for agent-aware diff output.
…handlers

handler_sync: add Kind field to diff stream item struct.
handler_audit: add Kind field to audit stream result.
handler_check: add Kind field to check stream result.
handler_update: add Kind field to update stream result.
handler_install: add Kind field to install request for agent support.
list_tui_item: show [A] badge prefix for agents in terminal list view.
list.go: add Kind field to skillEntry and skillJSON structs.

SyncPage: add kind badge to diff items using DiffTarget.items.kind.
AuditPage: add kind badge to audit result cards.
UpdatePage: add kind badge to update result items.
SkillPickerModal: add kind badge in skill picker.
client.ts: add kind to DiffTarget items and AuditResult types.
CollectPage: show kind badge next to local skill names in scan results.
BatchUninstallPage: show kind badge next to each skill in uninstall list.
Add RepoURL field to AgentCheckResult. Add EnrichAgentResultsWithRemote()
that batches remote HEAD hash checks via ParallelCheckURLs and marks
agents as 'update_available' when remote has newer commits than the
installed version.
Create website/docs/understand/agents.md covering:
- Skills vs Agents comparison table
- Directory structure (global + project)
- Agent file format and naming conventions
- Supported targets (claude, cursor, opencode, augment)
- Sync modes (merge/symlink/copy)
- .agentignore usage
- Install from repos with auto-detection
- CLI commands reference
- Data flow diagram

Update sidebar ordering to include agents between skill-format and
project-skills.
installTrackedRepoImpl: discover agents alongside skills after clone.
Report agent count in warnings. Update empty-repo warning to account
for repos that have only agents.

updateTrackedRepo: discover agents after git pull, report count.
…nstall

7 integration tests covering:
- install --kind flag parsing and validation
- install -a flag parsing
- check agents with empty dir, local agent, and JSON output
- enable/disable --kind agent routing to .agentignore
- uninstall --kind agent flag parsing
…pages

Command pages updated (7 files):
- list: 'skillshare list agents', [A] badge
- install: --kind agent, -a flag, auto-detection
- sync: agent sync with all three modes, supported targets
- check: 'skillshare check agents' drift detection
- audit: 'skillshare audit agents'
- enable: --kind agent routes to .agentignore
- uninstall: --kind agent flag

Getting started updated:
- first-sync: link to agents concepts in What's Next
- quick-reference: agent management command table + agents source path

Commands index: added agents row to What do you want to do table.
Rename SkillsPage.tsx to ResourcesPage.tsx. Page title changed to
'Resources' with subtitle showing both skill and agent counts.

Add top-level SegmentedControl tabs (Skills | Agents) for switching
between resource types. Each tab has its own count badge. Sub-filters
(All/Tracked/GitHub/Local) apply within the active tab.

Tab selection persists via ?tab=agents URL param. Dashboard stat cards
link to /resources and /resources?tab=agents.

Route: /resources is the primary path; /skills kept as alias.
Nav sidebar: 'Skills' → 'Resources' with Layers icon.
Keyboard shortcut 's' → /resources.
Tour updated for resource-oriented language.
…tabs

Move resource type toggle into the sticky toolbar row alongside the
view toggle. Use connected + size='md' SegmentedControl matching the
grid/folder/table view toggle design (icon + text label, white active
background, shared border container).

Removes the separate tab section above the toolbar — both controls
now live in the same horizontal bar for a cleaner, more compact layout.
…/Agents

Use underline tab pattern for Skills/Agents primary navigation:
- Border-bottom indicator on active tab (pencil color)
- Icon + label + count for each tab
- Sits between page header and sticky toolbar
- Clear visual hierarchy: underline tabs (primary) vs pill filters (secondary)

Removes the connected SegmentedControl that was visually identical
to the sub-filters, causing hierarchy confusion.
…l theme

Replace raw button underline tabs with ss-segmented + ss-segmented-item
classes. This hooks into the existing playful theme CSS which applies
wobbly border-radius, hard offset shadows, and pencil-colored active
state — matching the hand-drawn aesthetic of other segmented controls.

Uses non-connected variant (gap between buttons) to visually
distinguish from the sub-filter pills below.
runkids added 21 commits April 10, 2026 03:56
…dup status cards, shared glob utility

- Store api.updateAllStream() return value in esRef so unmount cleanup
  closes both check and update EventSource connections
- Extract ItemStatusCard component to deduplicate ~50 lines of per-item
  status card rendering between updating and done phases
- Wrap successCount/skippedCount/blockedCount/errorCount in a single
  useMemo pass instead of 4 separate .filter() calls
- Move globToRegex to ui/src/lib/glob.ts shared utility, imported by
  both UpdatePage and BatchUninstallPage
Check results were keyed by repo directory name (e.g. _awesome-claude-agents)
while UI items used per-skill names (api-architect, backend-developer, ...).
applyCheckResult now iterates updatable items and maps each repo's status
to all items belonging to it, so tracked repo entries no longer get stuck
in the Checking state.
The large StreamProgressBar appeared between the PageHeader and the tab
bar when checking started, pushing the whole list down. Loading state
is already conveyed by the Check All / Check Selected button spinners
and the per-item 'Checking' badges, so the big bar was redundant.
Enables upcoming theme system tests that need to run the CLI with
custom SKILLSHARE_THEME or NO_COLOR env vars.
Introduces a unified light/dark terminal theme system:
- Theme struct with sync.Once-backed Get()/Reset() singleton
- darkPalette (softened Primary from 15 to 252) and lightPalette
  (new, WCAG AA compliant against white backgrounds)
- Style constructors (Primary, Muted, Accent, Success, Warning,
  Danger, Info, Title, SelectedRow, Badge, Severity)
- ANSISet for plain CLI output
- Resolution precedence: NO_COLOR > SKILLSHARE_THEME > OSC 11 probe
  > dark fallback
- 300ms timeout on OSC 11 probe with documented goroutine leak tradeoff
- canDetect() gate for non-TTY, CI, TERM=dumb, Windows-safe
- WCAG contrast tests as regression guard for future palette edits

NO_COLOR env var follows the no-color.org spec: only activates when
set AND non-empty (empty string does not enable no-color mode).

This commit adds the package but does not migrate any existing
callers. The next commits migrate list TUIs (fixes #125), plain CLI
output, and remaining TUIs.

Refs: #125
Replaces all tc.* references in list_tui.go, list_tui_item.go, and
list_tui_content.go with the new internal/theme API. Also fixes the
hardcoded lipgloss.Color("15") at list_tui_item.go:296 — the root
cause of issue #125.

NOTE: The codebase does not compile at this commit alone because
other TUIs still reference the tc struct. The full build is
restored in commit 4 of this PR (migration of remaining TUIs and
deletion of legacy palettes). Treat this PR as one atomic change.

Fixes #125
Updates Success/Error/Warning/Info/Header/Status/Checkbox/
CheckboxItem/ActionLine/Logo to source their colors from the
new theme.ANSI() set instead of package-level constants.

Package-level constants (Red, Green, White, etc.) are kept with
// Deprecated: comments to preserve compatibility with any
third-party code that imports this package directly.

Colorize() now also honors NO_COLOR via theme.Get().NoColor.
Replaces all tc.* references in 26 files under cmd/skillshare/
with the new internal/theme API. Also removes the file-local ac
struct from audit_tui.go and the lc struct from log_tui.go.

Files touched: analyze_tui.go, analyze_tui_item.go, audit_render.go,
audit_rules_tui.go, audit_tui.go, checklist_tui.go, diff_tui.go,
extras.go, extras_init_tui.go, extras_list_tui.go,
extras_list_tui_item.go, hub.go, install_prompt_tui.go, log_tui.go,
new_tui.go, restore_tui.go, search_batch.go, search_tui.go,
sync.go, sync_agents.go, sync_parallel.go, target_agents_test.go,
target_list_tui.go, trash_tui.go, tui_helpers.go.

tui_colors.go (the tc struct definition file) is kept for now; it
will be deleted in the final cleanup commit along with the doctor
integration and main.go early init call.

Refs: #125
Finishes the theme system migration:

- Deletes cmd/skillshare/tui_colors.go entirely (~152 lines). The
  tc struct and tcSevStyle/riskLabelStyle/formatRiskBadgeLipgloss
  helpers are all replaced by equivalents in internal/theme.
- Migrates last 6 helper-function callers in audit_tui.go and
  search_tui.go.
- Adds checkTheme() to doctor.go with warning status on fallback,
  wired into runDoctorChecks() after checkSymlinkSupport.
- Adds theme.Get() call early in main() so OSC 11 probe overhead
  happens at startup, not during TUI rendering.

After this commit:
- grep 'lipgloss.Color(' cmd/skillshare/ returns only the hardcoded
  brand yellow #D4D93C (logo color)
- grep 'tc.|ac.|lc.' cmd/skillshare/ returns only loop variables
- Full build and test suite pass

Refs: #125
UpdatePage uses variant="warning" on the Force Retry button for
blocked items to visually distinguish them from error-state Force
Retry (which uses danger). The Button component didn't expose a
warning variant, causing the Docker build to fail with a TS2322
type error.

Adds warning alongside existing danger variant, mirroring the same
outlined-with-hover-fill pattern and matching the warning color
scheme already used by Badge and in-line text-warning classes.
The list TUI had two grouping bugs:

1. Local nested skills (e.g. mma/agent-browser, mma/docker-expert) were
   lumped into the "standalone" group because buildGroupedItems keyed on
   RepoName, which is empty for non-tracked skills.

2. Agents deep inside a tracked repo (e.g. _vijay-agents/agents/core/x.md,
   _vijay-agents/agents/specialized/python/y.md) were split into separate
   groups per sub-directory. discoverAndBuildAgentEntries set RepoName to
   filepath.Dir(RelPath), producing keys like '_vijay-agents/agents/core'
   instead of the tracked repo root.

Fix:

- discoverAndBuildAgentEntries now uses d.RepoRelPath (already computed
  by agent discovery) so tracked agents share one visual group regardless
  of nesting depth. This also corrects a pre-existing mis-count where
  local nested agents were counted as tracked in the summary footer.

- Add skillTopGroup() helper in list_tui_filter.go: tracked → RepoName;
  non-tracked nested → first RelPath segment; flat → "" (standalone).

- buildGroupedItems now keys on skillTopGroup() so local nested groups
  (mma/*) render as their own bucket instead of standalone.

- sortSkillEntries default sort now groups by top-level bucket first,
  placing standalone last, so buildGroupedItems sees contiguous blocks.

- Remove 'if opts.SortBy != ""' gating in both global list paths: sort
  must always run to guarantee the TUI grouping invariant.

Tests: 4 new unit tests cover local nested grouping, deep tracked agents,
skillTopGroup cases, and the top-group-aware sort order.
Extend install/update with agent-aware --json output and apply the same
audit block-threshold gate skills already use.

Install:
- install --json: imply --force; imply --all only when neither
  --skill nor --agent is set (so explicit selectors still work)
- project-mode install now routes through cmdInstallProjectParsed
  so --json suppresses UI and emits a pure-JSON payload
- agent installs propagate SourceDir so metadata lands in the
  agents root, not the install subdir
- validation error lists --agent / --kind / --branch explicitly

Update agents:
- update agents supports --force, --skip-audit, --audit-threshold
- tracked agent repos + metadata-backed single-file agents now run
  the same audit gate as skills; blocks roll back from a temp stage
- JSON output returns the final per-agent status
  (updated/skipped/failed/up_to_date/...) by merging check results
  with batch update outcomes

Audit:
- auditInstalledAgent shares one helper with auditInstalledSkill
  (scan + cleanup callbacks); single-file agent scans now use
  audit.ScanFile / ScanFileForProject instead of staging the file
  into a temp directory
- UpdateAgentFromDiscovery stages to temp, audits, then renames
  atomically (rename already overwrites on POSIX)

Refactors pulled in while reworking these paths:
- extract jsonUISuppressor helper in json_output.go and use it
  from install/update/update_agents; collapses 4 copies of the
  suppress/restore closure dance and the per-error failJSON block
- drop relPath plumbing from installAgentFromDiscoveryInternal
  now that ScanFile doesn't need a staged relative path
- list.go render functions now use theme.ANSI() so NO_COLOR is
  respected in plain-text output

Tests:
- add TestInstallAgentFromDiscovery_HighFindingBlocked (unit)
- add TestUpdate_Agents_HighFindingBlockedByThreshold (integration)
- add TestInstall_Project_JSON_Agent_PureJSON,
  TestUpdate_Agents_JSON_ReportsFinalStatus
- fix TestList_SKILLSHARE_THEME_Light / TestList_NO_COLOR to
  write a config before invoking list
- fix TestTargetList_NoTUI_FallsBackToPlainText assertion to match
  the new structured Mode: merge output
- fix TestDoctor_AllGood_PassesAll by pinning SKILLSHARE_THEME=dark
  so the no-TTY theme fallback warning doesn't fire
- add list_tui_content_test.go covering light/dark glamour base
- list detail pane now picks LightStyleConfig on light terminals

Docs:
- update install.md, update.md, understand/agents.md for the new
  flags, JSON shapes, and agents update workflow
- skills/skillshare/SKILL.md: mention agents commands/flags in description
- website: document agents source dir, agent backup/restore, ignores,
  file structure, config fields, and project-mode agent rules
…ectory

URLs like https://github.com/owner/repo/blob/main/SKILL.md previously
became subdir="SKILL.md" and created an install folder literally named
"SKILL.md". Treat a trailing SKILL.md segment on blob URLs as a pointer
to its containing skill directory:

  blob/main/SKILL.md              → subdir "", name = repo
  blob/main/skills/foo/SKILL.md   → subdir "skills/foo", name = foo

Also apply the same rule to GitLab (-/blob/...) and Bitbucket (src/...)
web URLs for consistency.

Refs: #124
…ator repos

When a repo contains both a root SKILL.md and child skills, picking
"Select individual skills" previously excluded the root entirely, so
the orchestrator skill could never be installed from the multi-select
UI — users had to resort to --name as a workaround.

Include the root skill in the individual selection list (listed first)
so it is visible and selectable alongside its children.

Refs: #124
An orchestrator repository containing a root SKILL.md together with
child SKILL.md directories (e.g. iOfficeAI/OfficeCLI) previously
installed as a single bundled directory that mirrored the git clone:
copying the root dragged every child skill dir into it, and children
marked selected were silently skipped as "included in parent" while
their computed dest paths were never written to.

Make each discovered skill a first-class install:

- New copyDirExcluding() skips subdirectories by slash-normalized
  relative path, so a skill directory is copied without duplicating
  any nested skill that is itself being installed elsewhere.
- installFromDiscoveryImpl computes the descendant skill paths of the
  skill currently being copied and passes them as excludes. For the
  root of an orchestrator repo this drops every child skill dir; for
  a non-root skill it drops any sub-skill nested inside it.
- installSelectedSkills stops skipping children after the root is
  installed. The existing dest-path logic already places each child
  under <parentName>/<childName>, so the children are written as
  siblings to the root install.

After the fix, a multi-skill repo with N skills produces N independent
installed directories discoverable by sync, updatable individually.

Refs: #124
…tempt

InferTrackedKind was called before installTrackedRepoImpl's IsGit()
guard, causing --track with local paths to attempt a clone with an
empty URL instead of returning the correct error message.

Add an early IsGit() check so non-git sources fail with the expected
'--track requires a git repository source' error.
Covers all three fixes:
- orchestrator children install as independent skills
- root skill selectable via --skill filter
- blob URL trailing SKILL.md resolution (via unit test)

Refs: #124
… TUI follows cursor

Two related improvements for issue #124:

1. Source parsing now tracks ExplicitSkill when a blob URL points
   directly at a SKILL.md file. Discovery constrains results to
   the root skill only, skipping the orchestrator pack/selection
   prompt entirely — the user clearly wants that one skill.

2. Single-select (radio) checklist TUI reworked: selection follows
   the cursor automatically, space keeps exactly one item active,
   enter confirms the focused item. Pre-selected items set the
   initial cursor position. This gives immediate visual feedback
   and eliminates the confusing empty-selection edge case.

Refs: #124
@runkids runkids linked an issue Apr 10, 2026 that may be closed by this pull request
@runkids runkids changed the title feat: agents are a first-class resource type alongside skills. Install, sync, audit, update, uninstall, and back them up with the same workflow v0.19.0 Apr 10, 2026
Copy link
Copy Markdown

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces comprehensive support for managing 'agents' as a first-class resource kind alongside skills. Key changes include updating the CLI to support agent-specific commands (list, sync, collect, uninstall, backup, restore, doctor), adding agent-specific configuration and metadata management, and implementing a new TUI tab system to display both skills and agents. Additionally, the metadata storage system was migrated to a centralized .metadata.json file, and various runbooks were added to validate these new workflows. I have no feedback to provide as the changes are well-structured and include necessary documentation and testing coverage.

The os package was imported but not referenced, causing the online
integration test build to fail in CI (docker-sandbox-online job).
The two Antigravity batch audit tests each download the full repo and
run install/update cycles. The first test alone consumes ~117s, leaving
insufficient budget for the second test's install + update phases
within the 300s limit. Bump to 600s to accommodate network-backed
end-to-end flows.
@runkids runkids merged commit f159f9e into main Apr 11, 2026
14 of 15 checks passed
@runkids runkids deleted the feat/agents branch April 11, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: first-class agent support

1 participant