Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
169 commits
Select commit Hold shift + click to select a range
f18184b
add `policies` and `sub_agent_policies`
dimaMachina Dec 19, 2025
b577aae
Runtime prompt assembly setup [skip-ci]
dimaMachina Dec 19, 2025
ee69811
loadPolicies setup
dimaMachina Dec 19, 2025
d04019d
loadPolicies setup
dimaMachina Dec 19, 2025
949fbb7
loadPolicies setup
dimaMachina Dec 19, 2025
b35b85d
crud setup
dimaMachina Dec 19, 2025
382c05b
Merge branch 'main' into prd-5492
dimaMachina Dec 22, 2025
c75f90b
add migration, biome ignore, and sidebar
dimaMachina Dec 22, 2025
800838e
refactor policy loader
dimaMachina Dec 22, 2025
da17975
add policies in activities-planner-advanced example
dimaMachina Dec 22, 2025
12c9744
Merge branch 'main' into prd-5492
dimaMachina Dec 22, 2025
9d4a34a
Merge branch 'main' into prd-5492
dimaMachina Dec 22, 2025
4001297
Merge branch 'main' into prd-5492
dimaMachina Dec 22, 2025
4537de5
pnpm lock
dimaMachina Dec 22, 2025
318ad13
polish policies loader
dimaMachina Dec 22, 2025
b129cab
Merge branch 'main' into prd-5492
dimaMachina Dec 22, 2025
9103e22
wip
dimaMachina Dec 23, 2025
2a5c625
polish policy loader
dimaMachina Dec 23, 2025
2a31552
remove warning for prompt and use json editor in policy
dimaMachina Dec 23, 2025
b4aa146
table wip
dimaMachina Dec 23, 2025
255b225
clickable table
dimaMachina Dec 23, 2025
c52ae2c
polish policies page
dimaMachina Dec 23, 2025
9d843fd
remove policies/new page
dimaMachina Dec 23, 2025
1351ed1
create policy modal and policies page
dimaMachina Dec 23, 2025
0ee864d
modal polish
dimaMachina Dec 23, 2025
a991a5b
polish projectFull
dimaMachina Dec 23, 2025
504abe4
polish policies pages
dimaMachina Dec 23, 2025
080a80c
fix ssr warning
dimaMachina Dec 23, 2025
b2cbb6a
Merge branch 'main' into prd-5492
dimaMachina Jan 6, 2026
44c320c
Merge branch 'main' into prd-5492
dimaMachina Jan 7, 2026
2490709
pnpm lock
dimaMachina Jan 7, 2026
9baba27
add wip docs
dimaMachina Jan 7, 2026
ee7d83e
rename to skills
dimaMachina Jan 7, 2026
016c42e
rename to skills 2
dimaMachina Jan 7, 2026
35bfa86
rename to skills 3
dimaMachina Jan 7, 2026
1dfd37e
rename to skills 4
dimaMachina Jan 7, 2026
aaff06c
rename to skills 5
dimaMachina Jan 7, 2026
7438d6b
rename to skills 7
dimaMachina Jan 7, 2026
2156f8d
rename to skills 8
dimaMachina Jan 7, 2026
f86074a
wip
dimaMachina Jan 8, 2026
1cd10b8
wip
dimaMachina Jan 8, 2026
fdbf324
remove unused fields
dimaMachina Jan 8, 2026
fcba90d
add migration
dimaMachina Jan 8, 2026
eae11ad
rename
dimaMachina Jan 8, 2026
1385660
upd skills structure
dimaMachina Jan 8, 2026
c269fe7
polish
dimaMachina Jan 8, 2026
105b77f
polish posthog
dimaMachina Jan 8, 2026
09083a3
test skill and simple matter package replacement
dimaMachina Jan 8, 2026
1cfb67e
v0 of test fixture
dimaMachina Jan 8, 2026
3e4548f
make content as string
dimaMachina Jan 8, 2026
dc44724
upd
dimaMachina Jan 8, 2026
3484db2
more
dimaMachina Jan 8, 2026
523514e
upd
dimaMachina Jan 8, 2026
a3d9c48
upd
dimaMachina Jan 8, 2026
f556c3c
upd
dimaMachina Jan 8, 2026
1fbd17c
upd
dimaMachina Jan 8, 2026
7fc7f73
upd
dimaMachina Jan 8, 2026
63f85cc
upd
dimaMachina Jan 8, 2026
65922c7
reuse skill schema
dimaMachina Jan 8, 2026
a2049b9
update import
dimaMachina Jan 8, 2026
60666b0
move skill selector near prompt
dimaMachina Jan 8, 2026
f74943c
run format
dimaMachina Jan 8, 2026
997b881
refactor skill selector
dimaMachina Jan 8, 2026
1df30b0
fix command placeholder text
dimaMachina Jan 8, 2026
a10e4c8
refactor skill selector
dimaMachina Jan 8, 2026
093daed
refactor skill selector use data-id
dimaMachina Jan 8, 2026
cab3c01
use hexagon icon for skills
dimaMachina Jan 8, 2026
7f2c8ff
add tsdoc links
dimaMachina Jan 8, 2026
66a0c0b
rollback db changes to make git history less
dimaMachina Jan 8, 2026
c1cdb47
rollback biome changes [skip ci]
dimaMachina Jan 8, 2026
058f7af
use react compiler for skill selector
dimaMachina Jan 9, 2026
feb7dcc
Fail the build on any compiler diagnostic
dimaMachina Jan 9, 2026
6c6f6a5
add more margin per Sarah review
dimaMachina Jan 9, 2026
14d871a
forbid new as skill name
dimaMachina Jan 9, 2026
1a95266
remove unneeded stuff
dimaMachina Jan 9, 2026
fe87fa0
simplify
dimaMachina Jan 9, 2026
d05449a
cleanup imports
dimaMachina Jan 9, 2026
c9b9059
modal
dimaMachina Jan 9, 2026
023971d
modal
dimaMachina Jan 9, 2026
9dff861
remove unneeded create skill modal
dimaMachina Jan 9, 2026
cc87f5c
fix type error
dimaMachina Jan 9, 2026
4ca2038
polish
dimaMachina Jan 9, 2026
5f5aa28
polish
dimaMachina Jan 9, 2026
8175178
polish
dimaMachina Jan 9, 2026
471e095
rm unneeded
dimaMachina Jan 9, 2026
b414680
make name be 64 chars according spec
dimaMachina Jan 10, 2026
f5dbdeb
less nesting
dimaMachina Jan 10, 2026
9dcec57
fix docs link and remove id table column
dimaMachina Jan 10, 2026
54e59f2
reuse tool configuration ui for skills
dimaMachina Jan 10, 2026
b6f4e45
format
dimaMachina Jan 10, 2026
3fc0efe
p0lish
dimaMachina Jan 10, 2026
460cc74
[skip ci]
dimaMachina Jan 10, 2026
ff6e893
use react compiler for `SubAgentNodeEditor`
dimaMachina Jan 10, 2026
bc60679
remove unnecessary sort [skip ci]
dimaMachina Jan 10, 2026
4c241f5
show description in skill selector
dimaMachina Jan 10, 2026
77304b1
polish
dimaMachina Jan 10, 2026
14595e7
simplify
dimaMachina Jan 10, 2026
05f154d
remove skillLookup [skip ci]
dimaMachina Jan 10, 2026
e06dc2a
remove skillLookup 2 [skip ci]
dimaMachina Jan 10, 2026
5c3fce1
upd [skip ci]
dimaMachina Jan 10, 2026
f6fcdae
polish
dimaMachina Jan 10, 2026
6232609
polish
dimaMachina Jan 10, 2026
06c0fd1
polish
dimaMachina Jan 10, 2026
239aa4a
rollback agentFull test
dimaMachina Jan 11, 2026
fffe9b8
fix modal warning and make name disabled for update
dimaMachina Jan 11, 2026
b946454
fix rebuilding of sdk and core
dimaMachina Jan 11, 2026
81cf045
update SkillInsertSchema
dimaMachina Jan 11, 2026
320c88a
polish data access
dimaMachina Jan 11, 2026
4c2851c
create / upsert
dimaMachina Jan 12, 2026
2e1e5a9
do not override uiProperties
dimaMachina Jan 12, 2026
b90bd30
move SkillFrontmatterSchema from client exports
dimaMachina Jan 12, 2026
676992e
simplify client-exports
dimaMachina Jan 12, 2026
0986c2e
refactor skill form
dimaMachina Jan 12, 2026
d54e8e9
refactor schemas
dimaMachina Jan 12, 2026
e5918ad
remove weird error about skill not found when we remove skill
dimaMachina Jan 12, 2026
2599691
do not update tenantId and projectId
dimaMachina Jan 12, 2026
e512f16
format
dimaMachina Jan 12, 2026
5775833
rm
dimaMachina Jan 12, 2026
129223e
add available skills to store
dimaMachina Jan 12, 2026
ba62282
fix empty description for attached skill
dimaMachina Jan 12, 2026
a3384e5
remove type errors from skill routes
dimaMachina Jan 12, 2026
71c5bef
add always loaded flag
dimaMachina Jan 12, 2026
920f9f0
always loaded
dimaMachina Jan 13, 2026
2e7e5d1
always loaded
dimaMachina Jan 13, 2026
14020cf
always loaded
dimaMachina Jan 13, 2026
ca2dc3c
always loaded
dimaMachina Jan 13, 2026
a8a37e3
always loaded
dimaMachina Jan 13, 2026
3d6f5e3
always loaded
dimaMachina Jan 13, 2026
841b973
always loaded
dimaMachina Jan 13, 2026
08a7b9f
always loaded
dimaMachina Jan 13, 2026
5d70820
always loaded
dimaMachina Jan 13, 2026
63f4a86
fix typecheck
dimaMachina Jan 13, 2026
68ffa40
update snapshot
dimaMachina Jan 13, 2026
74cd460
Merge branch 'main' into prd-5492
dimaMachina Jan 13, 2026
f2861fc
pnpm i
dimaMachina Jan 13, 2026
a817a7a
fix manage ui tests
dimaMachina Jan 13, 2026
b8918e7
Merge branch 'main' into prd-5492
dimaMachina Jan 13, 2026
ac0f506
remove <skill.name> and fix SubAgentSkillWithIndexSchema schema response
dimaMachina Jan 13, 2026
77ef88c
update openapi.json
dimaMachina Jan 13, 2026
4a6e75b
update agent test
dimaMachina Jan 13, 2026
1a85392
update agent test
dimaMachina Jan 13, 2026
5004f7a
update agentfull test
dimaMachina Jan 13, 2026
17bb8d1
upd
dimaMachina Jan 13, 2026
5726c73
upd
dimaMachina Jan 13, 2026
b2b9245
upd
dimaMachina Jan 13, 2026
7a2f309
prompt builder test
dimaMachina Jan 13, 2026
4a18561
fix serialize
dimaMachina Jan 13, 2026
cb9f737
undo sub agent doc change
dimaMachina Jan 13, 2026
5192c17
polish
dimaMachina Jan 14, 2026
65c54e3
polish
dimaMachina Jan 14, 2026
9f0ad7a
polish
dimaMachina Jan 14, 2026
b321d8c
upd
dimaMachina Jan 14, 2026
a969c0a
Merge branch 'main' into prd-5492
dimaMachina Jan 15, 2026
807d7a1
fix type errors
dimaMachina Jan 15, 2026
8b031ab
Merge branch 'main' into prd-5492
dimaMachina Jan 15, 2026
09ed6d2
fix type errors
dimaMachina Jan 15, 2026
3a645cd
rm old migration
dimaMachina Jan 15, 2026
e1b30a8
add migration and regenerate snapshot
dimaMachina Jan 15, 2026
e2490e8
fix typecheck
dimaMachina Jan 15, 2026
5b30f1c
access db with `c.get('db')`
dimaMachina Jan 15, 2026
117b3df
add missing generateId
dimaMachina Jan 15, 2026
b8b0491
upd
dimaMachina Jan 15, 2026
cd7d030
rm migrations
dimaMachina Jan 15, 2026
ac23f9e
rm migrations
dimaMachina Jan 15, 2026
6a4b7b0
upd
dimaMachina Jan 16, 2026
7b2c52a
upd
dimaMachina Jan 16, 2026
60c6f9d
add migration
dimaMachina Jan 16, 2026
ba1cbd8
Merge branch 'main' into prd-5492
dimaMachina Jan 19, 2026
19f331e
update lock
dimaMachina Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ async function main(): Promise<void> {
credentialsDir: join(testDir, 'credentials'),
contextConfigsDir: join(testDir, 'context-configs'),
externalAgentsDir: join(testDir, 'external-agents'),
skillsDir: join(testDir, 'skills'),
};

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ export function generateMcpToolDefinition(
const q = quotes === 'single' ? "'" : '"';
const semi = semicolons ? ';' : '';

const toolVarName = toCamelCase(toolId);
const toolVarName = registry?.getVariableName?.(toolId, 'tools') ?? toCamelCase(toolId);
const lines: string[] = [];

lines.push(`export const ${toolVarName} = mcpTool({`);
Expand Down
27 changes: 23 additions & 4 deletions agents-cli/src/commands/pull-v3/components/project-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ export function generateProjectDefinition(
lines.push(`${indentation}models: ${formatObject(projectData.models, style, 2)},`);
}

if (shouldInclude(projectData.skills)) {
lines.push(
`${indentation}skills: () => loadSkills(path.join(${formatString(projectId, q)}, 'skills')),`
);
}

// stopWhen configuration - project-level limits
if (shouldInclude(projectData.stopWhen)) {
lines.push(`${indentation}stopWhen: {`);
Expand Down Expand Up @@ -183,7 +189,16 @@ export function generateProjectImports(
const imports: string[] = [];

// Always import project from SDK
imports.push(generateImport(['project'], '@inkeep/agents-sdk', style));
const sdkImports = ['project'];
if (shouldInclude(projectData.skills)) {
sdkImports.push('loadSkills');
}
imports.push(generateImport(sdkImports, '@inkeep/agents-sdk', style));
if (shouldInclude(projectData.skills)) {
const q = style.quotes === 'single' ? "'" : '"';
const semi = style.semicolons ? ';' : '';
imports.push(`import path from ${q}node:path${q}${semi}`);
}

// Generate imports for referenced components if registry is available
if (registry) {
Expand Down Expand Up @@ -216,9 +231,9 @@ export function generateProjectImports(
for (const toolId of toolIds) {
// Determine the actual component type by checking what's in the registry
let componentType: ComponentType = 'tools';
if (registry?.get(toolId, 'functionTools')) {
if (registry.get(toolId, 'functionTools')) {
componentType = 'functionTools';
} else if (registry?.get(toolId, 'tools')) {
} else if (registry.get(toolId, 'tools')) {
componentType = 'tools';
}

Expand Down Expand Up @@ -300,5 +315,9 @@ export function generateProjectFile(
const imports = generateProjectImports(projectData, style, registry);
const definition = generateProjectDefinition(projectId, projectData, style, registry);

return generateFileContent(imports, [definition]);
const definitions: string[] = [];

definitions.push(definition);

return generateFileContent(imports, definitions);
}
44 changes: 44 additions & 0 deletions agents-cli/src/commands/pull-v3/components/skill-generator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { mkdir, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { stringify } from 'yaml';

type SkillMap = Record<
string,
{
name: string;
description?: string | null;
content: string;
metadata?: Record<string, unknown> | null;
}
>;

function formatMetadata(metadata: Record<string, unknown>): string {
const yaml = stringify(metadata);
const indented = yaml
.split('\n')
.filter((line) => line.trim() !== '')
.map((line) => ` ${line}`)
.join('\n');
return `metadata:\n${indented}`;
}

export async function generateSkills(skills: SkillMap, skillsDir: string): Promise<void> {
await mkdir(skillsDir, { recursive: true });

for (const [skillId, skill] of Object.entries(skills)) {
const parts: string[] = ['---', `name: ${JSON.stringify(skill.name)}`];
parts.push(`description: ${JSON.stringify(skill.description ?? '')}`);

if (skill.metadata && Object.keys(skill.metadata).length > 0) {
parts.push(formatMetadata(skill.metadata));
}

parts.push('---', '', skill.content || '');

const skillDir = join(skillsDir, skillId);
await mkdir(skillDir, { recursive: true });

const filePath = join(skillDir, 'SKILL.md');
await writeFile(filePath, parts.join('\n'), 'utf8');
}
}
14 changes: 14 additions & 0 deletions agents-cli/src/commands/pull-v3/components/sub-agent-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,20 @@ export function generateSubAgentDefinition(
lines.push(`${indentation}},`);
}

// skills - ordered skill attachments by id
if (agentData.skills && Array.isArray(agentData.skills) && agentData.skills.length > 0) {
lines.push(`${indentation}skills: () => [`);
for (const skill of agentData.skills) {
const parts = [`id: ${formatString(skill.id, q)}`];
parts.push(`index: ${skill.index}`);
if (skill.alwaysLoaded) {
parts.push(`alwaysLoaded: ${skill.alwaysLoaded}`);
}
lines.push(`${indentation}${indentation}{ ${parts.join(', ')} },`);
}
lines.push(`${indentation}],`);
}

// canUse - tools that this agent can use directly (with .with() configuration if present)
if (agentData.canUse && Array.isArray(agentData.canUse) && agentData.canUse.length > 0) {
const toolReferences: string[] = [];
Expand Down
7 changes: 7 additions & 0 deletions agents-cli/src/commands/pull-v3/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ interface ProjectPaths {
credentialsDir: string;
contextConfigsDir: string;
externalAgentsDir: string;
skillsDir: string;
}

/**
Expand All @@ -109,6 +110,7 @@ function createProjectStructure(projectDir: string): ProjectPaths {
credentialsDir: join(projectRoot, 'credentials'),
contextConfigsDir: join(projectRoot, 'context-configs'),
externalAgentsDir: join(projectRoot, 'external-agents'),
skillsDir: join(projectRoot, 'skills'),
};

// Ensure all directories exist
Expand Down Expand Up @@ -447,6 +449,11 @@ export async function pullV3Command(options: PullV3Options): Promise<PullResult
// Step 5: Set up project structure
const paths = createProjectStructure(projectDir);

if (remoteProject.skills && Object.keys(remoteProject.skills).length) {
const { generateSkills } = await import('./components/skill-generator');
await generateSkills(remoteProject.skills, paths.skillsDir);
}

// Step 6: Introspect mode - skip comparison, regenerate everything
if (options.introspect) {
console.log(chalk.yellow('\n🔍 Introspect mode: Regenerating all files from scratch'));
Expand Down
1 change: 1 addition & 0 deletions agents-cli/src/commands/pull-v3/introspect-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ interface ProjectPaths {
credentialsDir: string;
contextConfigsDir: string;
externalAgentsDir: string;
skillsDir: string;
}

interface IntrospectOptions {
Expand Down
2 changes: 2 additions & 0 deletions agents-cli/src/commands/pull-v3/new-component-generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ interface ProjectPaths {
credentialsDir: string;
contextConfigsDir: string;
externalAgentsDir: string;
skillsDir: string;
}

interface NewComponentResult {
Expand Down Expand Up @@ -199,6 +200,7 @@ export async function createNewComponents(
credentialsDir: join(paths.projectRoot, tempDirName, 'credentials'),
contextConfigsDir: join(paths.projectRoot, tempDirName, 'context-configs'),
externalAgentsDir: join(paths.projectRoot, tempDirName, 'external-agents'),
skillsDir: join(paths.projectRoot, tempDirName, 'skills'),
}
: paths;

Expand Down
10 changes: 9 additions & 1 deletion agents-cli/src/commands/pull-v3/utils/component-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ export type ComponentType =
| 'fetchDefinitions'
| 'headers'
| 'models'
| 'project';
| 'project'
| 'skills';

export interface ComponentInfo {
id: string; // Original component ID
Expand Down Expand Up @@ -577,6 +578,13 @@ export function registerAllComponents(
}
}

// Register skills
if (project.skills) {
for (const skillId of Object.keys(project.skills)) {
registry.register(skillId, 'skills', `skills/${skillId}.md`);
}
}

// Register extracted status components
const statusComponents = extractStatusComponents(project);
for (const statusId of Object.keys(statusComponents)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@ const activitiesPlanner = subAgent({
)} in the timezone ${headersSchema.toTemplate(
'tz'
)}. When the user asks about activities in a given location, first ask the coordinates agent for the coordinates, and then pass those coordinates to the weather forecast agent to get the weather forecast. Then based on the weather forecast, ask the websearch MCP tool to search the web for good activities given the weather. Once you have the activities, use the calculate-activity-score tool to calculate a score for one of the activities based on the weather conditions- and then show the user the activity score in your response. When you receive web search results, create citation artifacts to document your sources.`,
skills: () => [
{ id: 'weather-safety', index: 0 },
{ id: 'formatting-itinerary-structure', index: 1 },
],
canDelegateTo: () => [weatherForecaster, coordinatesAgent],
canUse: () => [calculateActivityScore, exaMcpTool.with({ selectedTools: ['web_search_exa'] })],
dataComponents: () => [activities],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
import { project } from '@inkeep/agents-sdk';
import { activitiesPlannerAdvancedAgent } from './agents/activities-planner-advanced.js';
import { exaMcpTool } from './tools/exa-mcp.js';
import { weatherMcpTool } from './tools/weather-mcp.js';
import path from 'node:path';
import { loadSkills, project } from '@inkeep/agents-sdk';
import { activitiesPlannerAdvancedAgent } from './agents/activities-planner-advanced';
import { citation } from './artifact-components/citation';
import { activities } from './data-components/activities';
import { exaMcpTool } from './tools/exa-mcp';
import { weatherMcpTool } from './tools/weather-mcp';

export const myProject = project({
export const activitiesPlannerAdvanced = project({
id: 'activities-planner-advanced',
name: 'Activities planner advanced',
description: 'Activities planner project template',
agents: () => [activitiesPlannerAdvancedAgent],
tools: () => [weatherMcpTool, exaMcpTool],
skills: () => loadSkills(path.join('activities-planner-advanced/skills')),
models: {
base: { model: 'openai/gpt-4o-mini' },
base: {
model: 'openai/gpt-4o-mini',
},
},
tools: () => [weatherMcpTool, exaMcpTool],
dataComponents: () => [activities],
artifactComponents: () => [citation],
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
name: structured-itinerary-responses
description: Present time-aware itineraries with clear actions and citations
metadata:
author: example-org
version: "1.0"
---

- Start with a one-sentence summary tailored to the user’s location and weather window.
- Provide 3–5 time-blocked suggestions with clear actions, durations, and required items; highlight indoor pivots when weather shifts.
- End with a concise checklist plus source/citation references when web results influence recommendations.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
name: weather-safety-guardrails
description: "Keep activity suggestions safe and respect local conditions"
metadata:
author: example-org
version: "1.0"
---

- Avoid outdoor or risky activities when storms, extreme temperatures, or hazardous air quality are present.
- Offer indoor or low-exposure alternatives when precipitation probability exceeds 40% or heat index is above 32°C/90°F.
- Remind users to check local advisories and venue constraints (permits, hours, accessibility) before committing.
2 changes: 1 addition & 1 deletion agents-docs/content/deployment/vercel.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Create a Doltgres database at [**DoltHub**](https://hosted.doltdb.com).

Set your database connection string as an environment variable:

```
```dotenv
# Doltgres Database
INKEEP_AGENTS_MANAGE_DATABASE_URL=
# Postgres Database
Expand Down
10 changes: 9 additions & 1 deletion agents-docs/content/visual-builder/meta.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
{
"pages": ["sub-agents", "tools", "headers", "structured-outputs", "context-fetchers", "..."]
"pages": [
"sub-agents",
"tools",
"headers",
"structured-outputs",
"context-fetchers",
"skills",
"..."
]
}
35 changes: 35 additions & 0 deletions agents-docs/content/visual-builder/skills.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
---
title: Skills
description: Reusable instruction blocks you can attach to sub-agents
icon: LuHexagon
keywords: skills, prompts, instructions, reuse, sub-agents
---

## Overview

Skills are reusable instruction blocks that you can attach to multiple sub-agents. They help you keep shared rules,
tone, and formatting consistent across the agent graph while still allowing each sub-agent to focus on its own role.

## Create a skill

1. Go to **Skills** in the left sidebar.
2. Click **Create skill**.
3. Fill in the required fields and save.

## Fields

- [**Name**](https://agentskills.io/specification#name-field): A short identifier.
- [**Description**](https://agentskills.io/specification#description-field): When to use this skill.
- [**Content**](https://agentskills.io/specification#body-content): The Markdown body, write whatever helps agents perform the task effectively.
- [**Metadata (JSON)**](https://agentskills.io/specification#metadata-field): Additional properties not defined by [the Agent Skills spec](https://agentskills.io/home).

## Attach skills to sub-agents

Open an agent in the Visual Builder, select a sub-agent node, and use the **Skills** picker to attach one or more
skills. You can drag to reorder them and control their priority.

Use **Always loaded** to include a skill in every prompt. It's off by default so skills load on demand unless you
enable it.

On-demand skills appear as an outline in the system prompt and can be loaded when needed via the built-in
`load_skill` tool.
Loading
Loading