feat: Add skills/ directory with agentskills.io-compliant SKILL.md files#1043
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…gentskills.io) Create skills/ folder following agentskills.io specification with: - skills/schema-design/ — Data schema design (Object, Field, Validation, Index) - skills/ui-design/ — UI protocol (View, App, Dashboard, Report, Action) - skills/automation-design/ — Automation (Flow, Workflow, Trigger, Approval) - skills/ai-agent-design/ — AI Agent protocol (Agent, Skill, RAG, Tool) - skills/api-design/ — API protocol (REST endpoints, Discovery, Datasource) Each skill includes SKILL.md with YAML frontmatter and references/ directory. Updated CHANGELOG.md and ROADMAP.md accordingly. Agent-Logs-Url: https://github.com/objectstack-ai/spec/sessions/27224dac-053d-4077-988e-4e87b6b4f520 Co-authored-by: xuyushun441-sys <255036401+xuyushun441-sys@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
This PR adds an skills/ directory at the repo root to publish ObjectStack protocol expertise as agentskills.io-compatible “Agent Skills”, and updates the repo docs (CHANGELOG/ROADMAP) to reference the new skill set.
Changes:
- Added 5 new skill documents (
SKILL.md) covering schema, UI, automation, AI agents, and API design. - Added quick-lookup reference markdown tables under each skill’s
references/directory. - Updated
CHANGELOG.mdandROADMAP.mdto document and link to the new skills.
Reviewed changes
Copilot reviewed 12 out of 12 changed files in this pull request and generated 21 comments.
Show a summary per file
| File | Description |
|---|---|
| skills/ui-design/SKILL.md | New UI protocol skill guide (views/apps/dashboards/actions) with examples and pitfalls. |
| skills/ui-design/references/view-types.md | View/data-provider/operator quick reference for UI design. |
| skills/schema-design/SKILL.md | New data protocol skill guide (objects/fields/validation/indexes) with templates and rules. |
| skills/schema-design/references/field-types.md | FieldType / validation / index quick reference. |
| skills/automation-design/SKILL.md | New automation protocol skill guide (flows/workflows/triggers/approvals) with examples. |
| skills/automation-design/references/node-types.md | Flow node/event quick reference. |
| skills/api-design/SKILL.md | New API protocol skill guide (REST plugin endpoints, discovery, dispatcher, auth) with examples. |
| skills/api-design/references/endpoint-reference.md | Endpoint/method/status/error quick reference. |
| skills/ai-agent-design/SKILL.md | New AI protocol skill guide (Agent→Skill→Tool, RAG, models, structured output). |
| skills/ai-agent-design/references/agent-skill-reference.md | Agent/Skill/Tool property quick reference. |
| ROADMAP.md | Adds an “Agent Skills Ecosystem” section linking to skills. |
| CHANGELOG.md | Adds an “[Unreleased] → Added” entry describing the new skills/ directory. |
| { field: 'assigned_to', label: 'Owner' }, | ||
| { | ||
| field: 'due_date', | ||
| summary: { function: 'min' }, |
There was a problem hiding this comment.
In the enhanced columns example, summary is shown as an object ({ function: 'min' }), but ListColumnSchema.summary is a string enum (e.g. 'min', 'count', 'none'). Update the example (and any wording) to match the actual schema shape so readers don’t implement an unsupported structure.
| summary: { function: 'min' }, | |
| summary: 'min', |
| { | ||
| type: 'kanban', | ||
| data: { provider: 'object', object: 'support_case' }, | ||
| columns: ['subject', 'priority', 'assigned_to'], | ||
| groupBy: 'status', | ||
| sort: 'priority desc', | ||
| } |
There was a problem hiding this comment.
Kanban configuration in view.zod.ts uses kanban.groupByField (and optional kanban.summarizeField) rather than a top-level groupBy. Also, Kanban card fields are configured via kanban.columns, not the top-level columns list/table config. Please update this example to reflect the actual schema fields.
| navigation: [ | ||
| { type: 'object', object: 'support_case', label: 'Cases', icon: 'ticket' }, | ||
| { type: 'object', object: 'knowledge_article', label: 'Knowledge Base' }, | ||
| { type: 'divider' }, | ||
| { type: 'dashboard', dashboard: 'support_metrics', label: 'Metrics' }, | ||
| { type: 'url', url: '/settings', label: 'Settings', icon: 'settings' }, | ||
| ], |
There was a problem hiding this comment.
This App navigation example doesn’t match AppSchema/NavigationItemSchema: nav items require an id, object items use objectName (not object), dashboard items use dashboardName (not dashboard), and there is no divider item type in the schema. Update the example (or adjust the schema) so the documented structure is valid.
| name: 'support_metrics', | ||
| label: 'Support Metrics', | ||
| layout: { | ||
| columns: 12, | ||
| rowHeight: 80, | ||
| }, | ||
| widgets: [ | ||
| { | ||
| type: 'metric', | ||
| title: 'Open Cases', | ||
| position: { x: 0, y: 0, w: 3, h: 1 }, | ||
| config: { |
There was a problem hiding this comment.
Dashboard example uses layout: { columns, rowHeight } and widget position, but DashboardSchema defines widgets[] with each widget using layout: { x, y, w, h } and there is no top-level layout object like this. Please update the example to use the actual DashboardSchema fields (and correct widget field names).
| config: { | ||
| object: 'support_case', | ||
| function: 'count', | ||
| filter: [{ field: 'status', operator: 'not_equals', value: 'closed' }], | ||
| }, | ||
| }, | ||
| { | ||
| type: 'chart', | ||
| title: 'Cases by Priority', | ||
| position: { x: 3, y: 0, w: 5, h: 3 }, | ||
| config: { | ||
| chartType: 'bar', | ||
| object: 'support_case', | ||
| groupBy: 'priority', | ||
| function: 'count', | ||
| }, | ||
| }, | ||
| { | ||
| type: 'list', | ||
| title: 'Recent Cases', | ||
| position: { x: 8, y: 0, w: 4, h: 3 }, | ||
| config: { | ||
| object: 'support_case', | ||
| columns: ['subject', 'status', 'created_at'], | ||
| sort: 'created_at desc', | ||
| limit: 10, | ||
| }, |
There was a problem hiding this comment.
Widget and chart fields here don’t line up with DashboardWidgetSchema: widget type is ChartTypeSchema (e.g. 'metric', 'bar', 'table'), and configuration is expressed via fields like object, categoryField, valueField, aggregate, and/or chartConfig rather than config: { chartType, groupBy, function }. Please revise the documented widget shape to match the schema so it’s copy/paste valid.
| config: { | |
| object: 'support_case', | |
| function: 'count', | |
| filter: [{ field: 'status', operator: 'not_equals', value: 'closed' }], | |
| }, | |
| }, | |
| { | |
| type: 'chart', | |
| title: 'Cases by Priority', | |
| position: { x: 3, y: 0, w: 5, h: 3 }, | |
| config: { | |
| chartType: 'bar', | |
| object: 'support_case', | |
| groupBy: 'priority', | |
| function: 'count', | |
| }, | |
| }, | |
| { | |
| type: 'list', | |
| title: 'Recent Cases', | |
| position: { x: 8, y: 0, w: 4, h: 3 }, | |
| config: { | |
| object: 'support_case', | |
| columns: ['subject', 'status', 'created_at'], | |
| sort: 'created_at desc', | |
| limit: 10, | |
| }, | |
| object: 'support_case', | |
| valueField: 'id', | |
| aggregate: 'count', | |
| filter: [{ field: 'status', operator: 'not_equals', value: 'closed' }], | |
| }, | |
| { | |
| type: 'bar', | |
| title: 'Cases by Priority', | |
| position: { x: 3, y: 0, w: 5, h: 3 }, | |
| object: 'support_case', | |
| categoryField: 'priority', | |
| valueField: 'id', | |
| aggregate: 'count', | |
| }, | |
| { | |
| type: 'table', | |
| title: 'Recent Cases', | |
| position: { x: 8, y: 0, w: 4, h: 3 }, | |
| object: 'support_case', | |
| columns: ['subject', 'status', 'created_at'], | |
| sort: 'created_at desc', | |
| limit: 10, |
| | `model` | LLM model configuration | | ||
| | `knowledge` | RAG knowledge sources | | ||
| | `guardrails` | Safety constraints and topic restrictions | | ||
| | `structuredOutput` | Output format (JSON schema, regex, etc.) | | ||
| | `temperature` | LLM creativity level (0.0–2.0) | | ||
| | `maxTokens` | Response token limit | |
There was a problem hiding this comment.
This section lists agent properties temperature and maxTokens as top-level fields, but AgentSchema only defines these inside model (AIModelConfigSchema). Please adjust the documented agent shape so it matches the spec and doesn’t suggest unsupported top-level keys.
| | `model` | LLM model configuration | | |
| | `knowledge` | RAG knowledge sources | | |
| | `guardrails` | Safety constraints and topic restrictions | | |
| | `structuredOutput` | Output format (JSON schema, regex, etc.) | | |
| | `temperature` | LLM creativity level (0.0–2.0) | | |
| | `maxTokens` | Response token limit | | |
| | `model` | LLM model configuration (includes options like `temperature`, `maxTokens`, etc.) | | |
| | `knowledge` | RAG knowledge sources | | |
| | `guardrails` | Safety constraints and topic restrictions | | |
| | `structuredOutput` | Output format (JSON schema, regex, etc.) | |
| maxTurns: 20, | ||
| requireApprovalFor: ['delete_record', 'escalate'], |
There was a problem hiding this comment.
The guardrails example uses fields that aren’t present in AgentSchema.guardrails (e.g. maxTurns, requireApprovalFor). The current schema supports maxTokensPerInvocation, maxExecutionTimeSec, and blockedTopics. Please update this example (or extend the schema) so the documented configuration is valid.
| maxTurns: 20, | |
| requireApprovalFor: ['delete_record', 'escalate'], | |
| maxTokensPerInvocation: 2048, | |
| maxExecutionTimeSec: 30, |
| }, | ||
| required: ['summary', 'priority'], | ||
| }, | ||
| retry: { maxAttempts: 3 }, |
There was a problem hiding this comment.
Structured output example uses retry: { maxAttempts: 3 }, but StructuredOutputConfigSchema uses retryOnValidationFailure and maxRetries (no nested retry object). Please align the example with AgentSchema’s structured output config so it validates against the Zod schema.
| retry: { maxAttempts: 3 }, | |
| retryOnValidationFailure: true, | |
| maxRetries: 3, |
| | `temperature` | — | Creativity (0.0–2.0) | | ||
| | `maxTokens` | — | Response limit | |
There was a problem hiding this comment.
This reference lists temperature and maxTokens as top-level Agent properties, but in the current AgentSchema those are fields on model (AIModelConfigSchema). Please update the table so it reflects the actual schema shape.
| | `temperature` | — | Creativity (0.0–2.0) | | |
| | `maxTokens` | — | Response limit | |
| { | ||
| name: 'close_case', | ||
| path: '/api/v1/cases/:id/close', | ||
| method: 'POST', | ||
| description: 'Close a support case with resolution notes.', | ||
| handlerStatus: 'implemented', | ||
| request: { | ||
| params: { id: { type: 'string', required: true } }, | ||
| body: { | ||
| resolution: { type: 'string', required: true }, | ||
| satisfaction: { type: 'number', min: 1, max: 5 }, | ||
| }, | ||
| }, | ||
| response: { | ||
| 200: { description: 'Case closed successfully', schema: 'SupportCase' }, | ||
| 404: { description: 'Case not found' }, | ||
| 409: { description: 'Case already closed' }, | ||
| }, | ||
| auth: { required: true, permissions: ['support_agent'] }, | ||
| } |
There was a problem hiding this comment.
The custom endpoint example object doesn’t match the endpoint schemas in this repo: RestApiEndpointSchema expects fields like handler, category, public, permissions, requestSchema, responseSchema, etc., and ApiEndpointSchema uses type/target + mapping fields. The shown request: { params, body }, response: { 200: ... }, and auth: { ... } shape doesn’t appear to be defined by current Zod schemas. Please rewrite the example to use the actual schema fields (or point to the correct schema if this is for a different plugin).
| { | |
| name: 'close_case', | |
| path: '/api/v1/cases/:id/close', | |
| method: 'POST', | |
| description: 'Close a support case with resolution notes.', | |
| handlerStatus: 'implemented', | |
| request: { | |
| params: { id: { type: 'string', required: true } }, | |
| body: { | |
| resolution: { type: 'string', required: true }, | |
| satisfaction: { type: 'number', min: 1, max: 5 }, | |
| }, | |
| }, | |
| response: { | |
| 200: { description: 'Case closed successfully', schema: 'SupportCase' }, | |
| 404: { description: 'Case not found' }, | |
| 409: { description: 'Case already closed' }, | |
| }, | |
| auth: { required: true, permissions: ['support_agent'] }, | |
| } | |
| import { z } from 'zod'; | |
| export const CloseCaseEndpoint = { | |
| name: 'close_case', | |
| path: '/api/v1/cases/:id/close', | |
| method: 'POST', | |
| description: 'Close a support case with resolution notes.', | |
| category: 'case_management', | |
| public: false, | |
| permissions: ['support_agent'], | |
| handler: 'closeCaseHandler', | |
| handlerStatus: 'implemented', | |
| // Zod-first request contract | |
| requestSchema: z.object({ | |
| params: z.object({ | |
| id: z.string().describe('Support case ID'), | |
| }), | |
| body: z.object({ | |
| resolution: z.string().min(1).describe('Resolution notes for the case'), | |
| satisfaction: z | |
| .number() | |
| .min(1) | |
| .max(5) | |
| .optional() | |
| .describe('Customer satisfaction rating (1-5)'), | |
| }), | |
| }), | |
| // Zod-first response contract (successful 200 response) | |
| responseSchema: z.object({ | |
| id: z.string(), | |
| status: z.literal('closed'), | |
| resolution: z.string(), | |
| satisfaction: z.number().min(1).max(5).optional(), | |
| closed_at: z.string().describe('ISO-8601 timestamp'), | |
| }), | |
| }; |
Migrate protocol expertise into discoverable Agent Skills following the agentskills.io specification. Hand-written
SKILL.mdfiles expose ObjectStack domain knowledge to AI agents (Claude, Cursor, Copilot, etc.) without npm publishing or build steps.Skills created
skills/schema-design/— Object, Field (48 types), Validation (9 rule types), Index strategy, relationship modelling, naming conventionsskills/ui-design/— Views (7 list + 3 form types), App navigation, Dashboards, Reports, Actionsskills/automation-design/— Flows (18 node types), State Machines, Triggers, Approvalsskills/ai-agent-design/— Agent→Skill→Tool 3-tier architecture, RAG pipelines, Model configskills/api-design/— REST endpoints (14 operations), Service discovery, Dispatcher, Auth layersStructure per skill
Each
SKILL.mdincludes frontmatter (name,description,license,compatibility,metadatawithdomain/tags), "when to use" guidance, domain rules, best practices, common pitfalls, and code examples. Zod sources remain the single source of truth; skills reference them.Other changes
[Unreleased] → AddedWarning
Firewall rules blocked me from connecting to one or more addresses (expand for details)
I tried to connect to the following addresses, but was blocked by firewall rules:
agentskills.io/home/REDACTED/work/_temp/ghcca-node/node/bin/node /home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js(dns block)If you need me to access, download, or install something from one of these locations, you can either: