Skip to content

feat(skills): redesign agent-skills + omni-skills with dynamic 42-skill catalog + MCP/A2A discovery - #2827

Merged
diegosouzapw merged 62 commits into
release/v3.8.8from
refactor/pages-v3-15-skills-pages-redesign
May 30, 2026
Merged

diegosouzapw merged 62 commits into
release/v3.8.8from
refactor/pages-v3-15-skills-pages-redesign

Conversation

@diegosouzapw

Copy link
Copy Markdown
Collaborator

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.

  • Agent Skills (/dashboard/agent-skills) — rewrite: grid of 42 cards (22 API + 20 CLI) with category/area filters, markdown preview pane (lazy react-markdown, no XSS), coverage bar (22/22 + 20/20), MCP+A2A links bar, and "Generate missing skills" action.
  • Omni Skills (rename of /dashboard/skills via 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.
  • Concept card (SkillsConceptCard, shared, variant agent/omni) on both pages with cross-link "Understand the difference".
  • Catalog dynamic — src/lib/agentSkills/{types,schemas,catalog,openapiParser,cliRegistryParser,generator}.ts derives 42 entries from curated source + OpenAPI + CLI registry parse.
  • 5 REST routes /api/agent-skills/{,[id],[id]/raw,coverage,generate} — Zod-validated, error-sanitized (buildErrorBody), generate requires requireManagementAuth.
  • 3 MCP tools omniroute_agent_skills_{list,get,coverage} under new scope read:catalog.
  • 1 A2A skill list-capabilities (6th in Agent Card) — returns markdown table of all 42 capabilities.
  • 42 SKILL.md generated + 18 old omniroute-* orphans pruned (curated content from 10 preserved via <!-- skill:custom-start/end --> markers; remaining 8 archived in _orchestration/15-pruned-archive/).
  • Coverage gate lowered from 75/75/75/70 to 40/40/40/40 (per request — pre-existing baseline ~82%).
  • i18n: new agentSkills namespace (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.

Wave Frente Files Tests
W1 F1 Foundation types/schemas/SkillsConceptCard/i18n/sidebar/redirect 26
W2 F2 Catalog + F8 UI Omni catalog/parsers + 8 omni-skills components 49 + 46
W3 F3 Gen + F4 REST + F5 MCP + F6 A2A + F7 UI generator/5 routes/3 tools/1 skill/5 components 20+16+19+11+22
W4 F9a curated migration + F9b apply 10 placeholders + 42 SKILL.md generated + 18 pruned content tests
W5 F10 audit + F11 gap-fixes integration tests + 5 docs + openapi yaml + 4 review fixes 29

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 — clean
  • npm run typecheck:noimplicit:core — clean
  • npm run check:cycles — no new cycles (210 files)
  • Unit tests — agentSkills suite (130 tests + 26 schemas + 6 SkillsConceptCard + 22 page + 19 MCP + 11 A2A + 16 routes + 20 generator + 46 omni-skills + ...) — all pass
  • Integration tests (tests/integration/agent-skills-{discovery,content}.test.ts) — 29/29 pass
  • Smoke catalog: count 42 cov {api:22/22, cli:20/20, total:42}
  • Smoke A2A: artifacts 1, total 42
  • Smoke MCP: tool omniroute_agent_skills_list returns 42 entries
  • Idempotência do generator: 2x rodadas consecutivas = 0 changes
  • Custom-block preservation: 10/10 IDs com conteúdo curado preservado
  • npm run test:coverage — gate baixado para 40/40/40/40 (baseline ~82% bem acima)
  • Manual browser smoke: /dashboard/agent-skills renderiza grid + preview; /dashboard/skills redireciona 308 → /dashboard/omni-skills

Hard Rules audit

# Verdict Evidence
#1 Secrets OK 0 literals in new code
#3 eval/Function OK 0 occurrences
#5 Raw SQL N/A No DB calls in agent-skills routes
#7 Zod OK safeParse in list+generate routes; GET-by-id validates inline
#8 Tests OK All new prod files have test counterpart
#10 --no-verify OK 0 bypasses
#12 Sanitize OK 19 buildErrorBody/errorResponse calls in routes
#13 Shell-interpol OK generator script uses JS vars, no shell strings
#15/#17 LOCAL_ONLY N/A No process spawning in new routes
#16 Co-Authored-By OK 0 trailers in any of the 52 commits

Notes

  • Coverage gate change (75/75/75/70 → 40/40/40/40) is the only modification outside the original scope — per user request to unblock PR landing.
  • Pre-existing vitest failures in audit.test.ts + encryption.spec.ts are unrelated to this PR (baseline-confirmed).
  • Dry-run + apply outputs in _tasks/features-v3.8.6/refactorpages/_orchestration/15-generator-output.md for auditability.
  • Archive of 18 pruned omniroute-* SKILL.md in _orchestration/15-pruned-archive/ (force-added).

…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).
@gemini-code-assist

Copy link
Copy Markdown
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-bot

kilo-code-bot Bot commented May 28, 2026

Copy link
Copy Markdown

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.

@diegosouzapw

Copy link
Copy Markdown
Collaborator Author

🔧 Iter-2: 6 gaps corrigidos após review profundo

Code review detalhado (40 itens auditados) identificou 6 gaps reais. Todos corrigidos em commits cirúrgicos.

# Gap Status Commits
A SkillsConceptCard simplificado — faltava tabela 5-linhas (O que é / Direção / Executor / Storage / Frase) ✅ FIXED 083d5c0fb
B tests/e2e/agent-skills-page.spec.ts ausente (Playwright) — exigido pelo DoD §10 ✅ FIXED 9ec7e4beb
C Sem debounce 200ms no preview fetch — D25 master-plan ✅ FIXED 3528ad451
D 42 SKILL.md gerados em PT-BR — plano §11 exige EN ✅ FIXED c73a90134 + e83696a49
E omni-providers sem endpoints rotate/metrics — §4.1 plano ✅ FIXED 60a91c116 + 16c5dfecb
F String "Todas" hardcoded em PT ✅ FIXED 52af5a13f

Resumo dos fixes

  • 52 arquivos, +867 / -445 LOC, 8 novos commits (sem Co-Authored-By)
  • Todos 42 SKILL.md regenerados em EN (## Overview / ## Authentication / ## Quick install / ## Subcommands)
  • Custom-blocks preservados (conteúdo curado dos 10 IDs migrados mantido)
  • SkillsConceptCard agora exibe tabela comparativa com 5 linhas (label | Agent | Omni)
  • E2E spec criado com 5 testes (concept-card visível, 42 cards, click→preview, cross-link nav, redirect 308)
  • Debounce 200ms via useEffect + setTimeout + clearTimeout

Validação pós-fix

  • npm run typecheck:core → PASS
  • npm run check:cycles → PASS
  • npm run lint → PASS
  • Vitest: SkillsConceptCard 9/9, agent-skills-page 22/22 — PASS
  • Node test runner: generator 20/20, integration discovery+content 30/30 — PASS
  • Smoke: count 42, cov api 22/22 cli 20/20
  • Idempotência confirmada: 2º run do generator = 0 changes
  • grep "## Overview" skills/*/SKILL.md = 42 / grep "## Visão geral" = 0

Total acumulado do PR

  • 61 commits (0 com Co-Authored-By)
  • 100% conformidade vs 15-skills-pages-redesign.plan.md + _orchestration/master-plan-15.md

@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.6 to release/v3.8.7 May 29, 2026 22:05
@diegosouzapw
diegosouzapw changed the base branch from release/v3.8.7 to release/v3.8.8 May 30, 2026 06:22
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
diegosouzapw merged commit 1ee177d into release/v3.8.8 May 30, 2026
2 checks passed
@diegosouzapw
diegosouzapw deleted the refactor/pages-v3-15-skills-pages-redesign branch May 30, 2026 13:01
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)
@diegosouzapw diegosouzapw mentioned this pull request Jun 2, 2026
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)
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.

1 participant