Repository navigation
feat(skills): redesign agent-skills + omni-skills with dynamic 42-skill catalog + MCP/A2A discovery - #2827
Merged
diegosouzapw merged 62 commits intoMay 30, 2026
Conversation
…lls + sidebar reorder
…CLI) Replace 18-entry hardcoded AGENT_SKILLS array with 42-entry CURATED_SKILLS covering all areas listed in D28 of the master plan. Each curated entry has id, name, description, category, area, icon, and optional flags. Adds backward-compatible AGENT_SKILLS alias (deprecated) that maps curated entries to the old AgentSkill shape with empty endpoints/cliCommands arrays so the existing /dashboard/agent-skills page continues to work until F7 rewrites it. Imports AgentSkill, SkillArea, SkillCategory types from src/lib/agentSkills/types.ts (F1 single source of truth) instead of redeclaring locally.
…tch helpers Implements the catalog.ts public API defined in §3.3 of the master plan: - getCatalog(): AgentSkill[] — returns 42 entries, lazy-cached in module scope - getSkillById(id): AgentSkill | null — lookup by canonical ID - filterCatalog(opts): AgentSkill[] — filter by category and/or area - computeCoverage(): SkillCoverage — reads skills/ dir and counts SKILL.md present - refreshCatalog(): void — invalidates cache (used by tests + generator) - fetchSkillMarkdown(id): Promise<SkillMarkdown> — reads local fs first, falls back to GitHub raw fetch with 1h Next.js cache (for F4 /raw route) API_SKILL_IDS and CLI_SKILL_IDS exported as readonly string arrays (D28 order). Single source of truth for all consumers (REST routes, MCP, A2A).
openapiParser.ts:
- parseOpenapi(): reads docs/reference/openapi.yaml via js-yaml (already a dep)
and returns { paths: Map<METHOD+path, OpenapiPath>, areas: Map<SkillArea, ops[]> }
- PATH_AREA_MAP maps 30+ path prefixes to SkillArea values
- getEndpointsForArea(area): convenience helper returning 'METHOD /path' strings
cliRegistryParser.ts:
- parseCliRegistry(): reads all bin/cli/commands/*.mjs via fs.readdirSync
and regex-parses .command(), .description(), .option() calls
- FILE_FAMILY_MAP maps 40+ file basenames to CLI SkillArea families
- getCommandsForFamily(family): convenience helper for catalog consumers
- Does NOT import Commander.js modules to avoid side-effects (D15)
agentSkills-catalog.test.ts (30 tests): - getCatalog(): 42 total, 22 api, 20 cli - API_SKILL_IDS/CLI_SKILL_IDS length assertions - ID regex format, uniqueness, required fields - getSkillById happy path + null for unknown/empty - filterCatalog by category, area, combined, empty - refreshCatalog() invalidates cache (new array reference) - computeCoverage() shape validation - rawUrl/githubUrl URL format assertions agentSkills-openapiParser.test.ts (9 tests): - Fixture YAML: paths Map, area groupings (providers, api-keys, inference) - OpenapiPath field validation - Missing file throws - Empty paths YAML returns empty Maps - Real openapi.yaml: providers area ≥5 endpoints (integration) agentSkills-cliRegistryParser.test.ts (10 tests): - Fixture .mjs: commands Map, families Map, ≥5 provider subcommands - Description extraction, isSubcommand flag, flags extraction - Skips unrecognised files, throws on missing dir - Real providers.mjs: ≥5 commands (integration)
Rename the page route from /dashboard/skills to /dashboard/omni-skills to align with the task-15 F8 redesign plan. The server component wrapper is reduced to a 5-line delegator, removing the prior 870-line monolith.
…onents Extract the 870-line page.tsx into OmniSkillsPageClient (state + orchestration) and 6 focused components: OmniSkillCard, OmniSkillsList, SkillInspectorPane, OmniExecutionsTab, OmniSandboxTab, OmniMarketplaceTab. - SkillsConceptCard variant="omni" rendered at top of page - 4 tabs (skills/executions/sandbox/marketplace) preserved - Skills tab uses 12-col split grid with SkillInspectorPane (4 sub-tabs) - SkillInspectorPane: schema/handler/executions/sandbox sub-tabs, mode buttons, uninstall, per-skill execution fetch
46 structural/source-pattern tests covering: file structure, page.tsx server component contract, PageClient 4-tab wiring, OmniSkillCard accessibility, SkillInspectorPane 4 sub-tabs + API fetches, OmniSkillsList split layout, OmniExecutionsTab columns, OmniSandboxTab config values, OmniMarketplaceTab dual-provider logic, and E2E path update.
Implements executeListCapabilities() which calls getCatalog() + computeCoverage() from the agentSkills catalog (F1/F2) and returns a markdown table covering all 42 skills (22 API + 20 CLI) with ID, name, category, area, endpoints/commands, and raw SKILL.md URL, matching the §3.7 result contract.
Adds "list-capabilities" entry to A2A_SKILL_HANDLERS in taskExecution.ts (dynamic import pattern, consistent with the 5 existing skills) and adds the 6th skill entry to /.well-known/agent.json with tags [discovery, capabilities] and example questions for agent discovery.
Adds 6 tests for executeListCapabilities (§3.7 shape, 42-skill IDs in markdown, coverage bounds, ISO datetime, handler registration) and 5 tests for the Agent Card route (6 skills total, list-capabilities presence + tags + examples, all original 5 skills preserved). All 11 pass.
Implements four read-only endpoints for the Agent Skills REST API (F4):
- GET /api/agent-skills — catalog with ?category= and ?area= filters,
returns { skills, count, coverage }
- GET /api/agent-skills/[id] — single skill by canonical ID (404 if absent)
- GET /api/agent-skills/[id]/raw — SKILL.md as text/markdown with
Cache-Control: public, max-age=3600; 502 on GitHub fallback failure
- GET /api/agent-skills/coverage — SkillCoverage (filesystem vs catalog)
All routes: export const dynamic = "force-dynamic" (filesystem reads),
error responses via buildErrorBody (Hard Rule #12), Zod input validation
(Hard Rule #7). coverage/route.ts force-added to git because .gitignore
matches the directory name "coverage/" — this is an API route, not a
report directory.
…default Implements POST /api/agent-skills/generate (F4): - Requires management auth via requireManagementAuth (same pattern as usage/combo-health-dashboard and other management routes) - Validates body via GenerateBodySchema (dryRun defaults true, prune defaults false — safe preview mode) - Dynamic import of @/lib/agentSkills/generator so the route coexists before F3 (generator.ts) is merged; returns 503 if module unavailable - Hard Rule #12: all error paths use buildErrorBody (400/401/403/503/500) - Hard Rule #7: Zod validates both JSON parse and schema shape
…rtions 16 tests covering all 5 endpoints: - GET /agent-skills: 42 total, category/area filters, invalid category → 400 - GET /agent-skills/[id]: found api+cli skills, unknown → 404 - GET /agent-skills/[id]/raw: unknown → 404, valid → 200/502/500 (network-tolerant) - GET /agent-skills/coverage: SkillCoverage shape (api.total=22, cli.total=20) - POST /generate: no auth → 401/403, invalid body → 400, no generator → 503 Hard Rule #12 verified explicitly in every error case: error.message must not match /\bat \/|\bat file:\/\// (no stack trace exposure). Final test collects all error paths and asserts sanitization in a single sweep.
… + prune
Implements src/lib/agentSkills/generator.ts (§3.4 contract):
- generateAgentSkills(opts): idempotent, dryRun:true default, prune:false default
- buildSkillMarkdown(skillId, sources): generates frontmatter + API/CLI body
- API body: Visão geral + Autenticação + Endpoints (with curl) + Payloads
- CLI body: Visão geral + Instalação rápida + Subcomandos (with flags + examples)
- Prune: detects orphans in skills/{id}/ not in catalog; deletes in apply mode
- Marker preservation: <!-- skill:custom-start --> ... <!-- skill:custom-end -->
- Generated comment: per D24 spec
…lls.mjs Implements the CLI wrapper for the generator: - --apply flag: enables write mode (default: dry-run) - --prune flag: enables orphan detection/deletion - --only=<id1,id2>: filters to specific skill IDs - --json flag: structured JSON output - Exit codes: 0 success, 1 error, 2 dry-run detected pending changes (CI) - Human-readable table output with Generated/Unchanged/Pruned/Orphans/Errors summary - Dynamic import via tsx/esm runtime; falls back to module.register() if needed
20 tests covering: - dry-run produces report without writing (filesystem unchanged) - apply writes SKILL.md for API and CLI skills with correct sections - apply writes all 42 skills when no filter - idempotency: second run reports 0 generated, all unchanged - prune dry-run detects orphans without deleting - prune apply deletes orphan dirs, preserves catalog dirs - marker preservation: custom block survives regeneration - buildSkillMarkdown: valid shape, no escape errors, correct sections per category - onlyIds filter limits generation - report shape validation Also adds gray-matter as dependency (per plan prerequisite check).
…generator-output)
Contributor
|
Warning You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again! |
|
Kilo Code Review could not run — your account is out of credits. Add credits or switch to a free model to enable reviews on this change. |
…ders (GAP-E) Update integration test to include omni-providers in the 11 custom-block IDs list.
… rotate endpoints, i18n)
Collaborator
Author
🔧 Iter-2: 6 gaps corrigidos após review profundoCode review detalhado (40 itens auditados) identificou 6 gaps reais. Todos corrigidos em commits cirúrgicos.
Resumo dos fixes
Validação pós-fix
Total acumulado do PR
|
Conflicts: CLAUDE.md base; openapi union + i18n deep-merge (costsSection=Custos); .source regenerated (fumadocs-mdx, +5 docs); openapi.generated regenerated. open-sse/mcp-server/server.ts: union — registers BOTH agentSkillTools (#2827) AND pluginTools (base plugin system) via two separate forEach loops; tool count sums both; skills handler keeps @ts-expect-error, plugins keeps @ts-ignore. server.ts type-safe (0 TS errors).
diegosouzapw
added a commit
that referenced
this pull request
Jun 1, 2026
…env-doc fixes - bump package.json / open-sse / electron / openapi / llm.txt to 3.8.8 - restructure CHANGELOG: Unreleased -> [3.8.8], dedup broken Notion/MCP block (was 12x) - add every PR since v3.8.7 that was missing: Quota Share Engine (#2859/#3022/#3032), page redesigns (#2827/#2839/#2847/#2849/#2869/#2873), and fixes #2960/#2973/#2984/ #3021/#3029/#3031/#3035/#3036/#3037/#3039/#3043/#3028; folded #2978/#2988/#3041 - insert [3.8.8] section into all 41 i18n CHANGELOGs + sync llm.txt mirrors - document OMNIROUTE_PLUGINS_ALLOW_EXEC in .env.example + ENVIRONMENT.md (env-doc-sync gap)
Merged
HouMinXi
pushed a commit
to HouMinXi/OmniRoute
that referenced
this pull request
Aug 2, 2026
Conflicts: CLAUDE.md base; openapi union + i18n deep-merge (costsSection=Custos); .source regenerated (fumadocs-mdx, +5 docs); openapi.generated regenerated. open-sse/mcp-server/server.ts: union — registers BOTH agentSkillTools (cheaper-inference#2827) AND pluginTools (base plugin system) via two separate forEach loops; tool count sums both; skills handler keeps @ts-expect-error, plugins keeps @ts-ignore. server.ts type-safe (0 TS errors).
HouMinXi
pushed a commit
to HouMinXi/OmniRoute
that referenced
this pull request
Aug 2, 2026
…pages-v3-15-skills-pages-redesign feat(skills): redesign agent-skills + omni-skills with dynamic 42-skill catalog + MCP/A2A discovery
HouMinXi
pushed a commit
to HouMinXi/OmniRoute
that referenced
this pull request
Aug 2, 2026
…env-doc fixes - bump package.json / open-sse / electron / openapi / llm.txt to 3.8.8 - restructure CHANGELOG: Unreleased -> [3.8.8], dedup broken Notion/MCP block (was 12x) - add every PR since v3.8.7 that was missing: Quota Share Engine (cheaper-inference#2859/cheaper-inference#3022/cheaper-inference#3032), page redesigns (cheaper-inference#2827/cheaper-inference#2839/cheaper-inference#2847/cheaper-inference#2849/cheaper-inference#2869/cheaper-inference#2873), and fixes cheaper-inference#2960/cheaper-inference#2973/cheaper-inference#2984/ cheaper-inference#3021/cheaper-inference#3029/cheaper-inference#3031/cheaper-inference#3035/cheaper-inference#3036/cheaper-inference#3037/cheaper-inference#3039/cheaper-inference#3043/cheaper-inference#3028; folded cheaper-inference#2978/cheaper-inference#2988/cheaper-inference#3041 - insert [3.8.8] section into all 41 i18n CHANGELOGs + sync llm.txt mirrors - document OMNIROUTE_PLUGINS_ALLOW_EXEC in .env.example + ENVIRONMENT.md (env-doc-sync gap)
Poid-ZA
pushed a commit
to Poid-ZA/OmniRoute
that referenced
this pull request
Aug 5, 2026
Conflicts: CLAUDE.md base; openapi union + i18n deep-merge (costsSection=Custos); .source regenerated (fumadocs-mdx, +5 docs); openapi.generated regenerated. open-sse/mcp-server/server.ts: union — registers BOTH agentSkillTools (cheaper-inference#2827) AND pluginTools (base plugin system) via two separate forEach loops; tool count sums both; skills handler keeps @ts-expect-error, plugins keeps @ts-ignore. server.ts type-safe (0 TS errors).
Poid-ZA
pushed a commit
to Poid-ZA/OmniRoute
that referenced
this pull request
Aug 5, 2026
…pages-v3-15-skills-pages-redesign feat(skills): redesign agent-skills + omni-skills with dynamic 42-skill catalog + MCP/A2A discovery
Poid-ZA
pushed a commit
to Poid-ZA/OmniRoute
that referenced
this pull request
Aug 5, 2026
…env-doc fixes - bump package.json / open-sse / electron / openapi / llm.txt to 3.8.8 - restructure CHANGELOG: Unreleased -> [3.8.8], dedup broken Notion/MCP block (was 12x) - add every PR since v3.8.7 that was missing: Quota Share Engine (cheaper-inference#2859/cheaper-inference#3022/cheaper-inference#3032), page redesigns (cheaper-inference#2827/cheaper-inference#2839/cheaper-inference#2847/cheaper-inference#2849/cheaper-inference#2869/cheaper-inference#2873), and fixes cheaper-inference#2960/cheaper-inference#2973/cheaper-inference#2984/ cheaper-inference#3021/cheaper-inference#3029/cheaper-inference#3031/cheaper-inference#3035/cheaper-inference#3036/cheaper-inference#3037/cheaper-inference#3039/cheaper-inference#3043/cheaper-inference#3028; folded cheaper-inference#2978/cheaper-inference#2988/cheaper-inference#3041 - insert [3.8.8] section into all 41 i18n CHANGELOGs + sync llm.txt mirrors - document OMNIROUTE_PLUGINS_ALLOW_EXEC in .env.example + ENVIRONMENT.md (env-doc-sync gap)
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
Conflicts: CLAUDE.md base; openapi union + i18n deep-merge (costsSection=Custos); .source regenerated (fumadocs-mdx, +5 docs); openapi.generated regenerated. open-sse/mcp-server/server.ts: union — registers BOTH agentSkillTools (cheaper-inference#2827) AND pluginTools (base plugin system) via two separate forEach loops; tool count sums both; skills handler keeps @ts-expect-error, plugins keeps @ts-ignore. server.ts type-safe (0 TS errors).
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…pages-v3-15-skills-pages-redesign feat(skills): redesign agent-skills + omni-skills with dynamic 42-skill catalog + MCP/A2A discovery
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…env-doc fixes - bump package.json / open-sse / electron / openapi / llm.txt to 3.8.8 - restructure CHANGELOG: Unreleased -> [3.8.8], dedup broken Notion/MCP block (was 12x) - add every PR since v3.8.7 that was missing: Quota Share Engine (cheaper-inference#2859/cheaper-inference#3022/cheaper-inference#3032), page redesigns (cheaper-inference#2827/cheaper-inference#2839/cheaper-inference#2847/cheaper-inference#2849/cheaper-inference#2869/cheaper-inference#2873), and fixes cheaper-inference#2960/cheaper-inference#2973/cheaper-inference#2984/ cheaper-inference#3021/cheaper-inference#3029/cheaper-inference#3031/cheaper-inference#3035/cheaper-inference#3036/cheaper-inference#3037/cheaper-inference#3039/cheaper-inference#3043/cheaper-inference#3028; folded cheaper-inference#2978/cheaper-inference#2988/cheaper-inference#3041 - insert [3.8.8] section into all 41 i18n CHANGELOGs + sync llm.txt mirrors - document OMNIROUTE_PLUGINS_ALLOW_EXEC in .env.example + ENVIRONMENT.md (env-doc-sync gap)
Open
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Redesigns the two skill pages of OmniRoute dashboard and turns Agent Skills into a fully dynamic catalog (42 entries: 22 API + 20 CLI), discoverable by external agents via MCP and A2A.
/dashboard/agent-skills) — rewrite: grid of 42 cards (22 API + 20 CLI) with category/area filters, markdown preview pane (lazyreact-markdown, no XSS), coverage bar (22/22 + 20/20), MCP+A2A links bar, and "Generate missing skills" action./dashboard/skillsvia 308 redirect) — same 4 tabs (Skills/Executions/Sandbox/Marketplace) preserved + new split grid + inspector pane (Schema/Handler/Executions/Sandbox sub-tabs); monolithic 871-line page split into 8 components.SkillsConceptCard, shared, variant agent/omni) on both pages with cross-link "Understand the difference".src/lib/agentSkills/{types,schemas,catalog,openapiParser,cliRegistryParser,generator}.tsderives 42 entries from curated source + OpenAPI + CLI registry parse./api/agent-skills/{,[id],[id]/raw,coverage,generate}— Zod-validated, error-sanitized (buildErrorBody),generaterequiresrequireManagementAuth.omniroute_agent_skills_{list,get,coverage}under new scoperead:catalog.list-capabilities(6th in Agent Card) — returns markdown table of all 42 capabilities.omniroute-*orphans pruned (curated content from 10 preserved via<!-- skill:custom-start/end -->markers; remaining 8 archived in_orchestration/15-pruned-archive/).agentSkillsnamespace (EN + PT-BR explicit; 39 other locales fall back to EN automatically).Implementation matrix
Coordinated via
_orchestration/master-plan-15.md(1648 lines). 10 frentes (F1-F11) across 5 waves, all parallel-safe with disjoint file ownership.Files changed: 133 (+16782/-2368) · Commits: 52 · Coverage final: 100% catalog (22/22 + 20/20).
Test plan
npm run lint— 0 errors (warnings pre-existing)npm run typecheck:core— cleannpm run typecheck:noimplicit:core— cleannpm run check:cycles— no new cycles (210 files)tests/integration/agent-skills-{discovery,content}.test.ts) — 29/29 passcount 42 cov {api:22/22, cli:20/20, total:42}artifacts 1, total 42omniroute_agent_skills_listreturns 42 entriesnpm run test:coverage— gate baixado para 40/40/40/40 (baseline ~82% bem acima)/dashboard/agent-skillsrenderiza grid + preview;/dashboard/skillsredireciona 308 →/dashboard/omni-skillsHard Rules audit
safeParsein list+generate routes; GET-by-id validates inlinebuildErrorBody/errorResponsecalls in routesNotes
75/75/75/70→40/40/40/40) is the only modification outside the original scope — per user request to unblock PR landing.audit.test.ts+encryption.spec.tsare unrelated to this PR (baseline-confirmed)._tasks/features-v3.8.6/refactorpages/_orchestration/15-generator-output.mdfor auditability.omniroute-*SKILL.md in_orchestration/15-pruned-archive/(force-added).