@ax-llm/ax 25.4.0 → 25.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ax-llm/ax",
3
- "version": "25.4.0",
3
+ "version": "25.4.2",
4
4
  "type": "module",
5
5
  "description": "The best library to work with LLMs",
6
6
  "repository": {
@@ -1,34 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- /**
4
- * Postinstall script for @ax-llm/ax
5
- *
6
- * Auto-installs/upgrades the Claude Code skill on package install.
7
- *
8
- * Features:
9
- * - Skips in CI environments (CI, CONTINUOUS_INTEGRATION env vars)
10
- * - Skips if AX_SKIP_SKILL_INSTALL=1
11
- * - Silent failure (never breaks package installation)
12
- * - Cross-platform (macOS, Linux, Windows)
13
- * - Only logs in interactive terminals (process.stdout.isTTY)
14
- * - Version-aware upgrades: only upgrades if newer version available
15
- */
16
-
17
- import {
18
- existsSync,
19
- mkdirSync,
20
- readFileSync,
21
- readdirSync,
22
- rmSync,
23
- writeFileSync,
24
- } from 'node:fs';
25
- import { basename, dirname, join, sep } from 'node:path';
3
+ // Register one entry-point skill with bundled guides. Specialist skills are
4
+ // available through the explicit setup command; package installation never
5
+ // adds them individually. Failures must never break dependency installation.
6
+ import { dirname, join, sep } from 'node:path';
26
7
  import { fileURLToPath } from 'node:url';
8
+ import { autoSkillInstallEnabled } from './skill-config.mjs';
9
+ import { installSkills } from './skill-install.mjs';
27
10
 
28
- const __filename = fileURLToPath(import.meta.url);
29
- const __dirname = dirname(__filename);
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
30
12
 
31
- // Check if we should skip installation
32
13
  function shouldSkip() {
33
14
  // Skip in CI environments
34
15
  if (process.env.CI === 'true' || process.env.CI === '1') {
@@ -73,88 +54,6 @@ function shouldSkip() {
73
54
  return false;
74
55
  }
75
56
 
76
- // Check if we're in an interactive terminal
77
- function isInteractive() {
78
- return process.stdout.isTTY === true;
79
- }
80
-
81
- /**
82
- * Compare semver versions
83
- * Returns: 1 if a > b, -1 if a < b, 0 if equal
84
- */
85
- function compareSemver(a, b) {
86
- const parseVersion = (v) => {
87
- const match = v.match(/^(\d+)\.(\d+)\.(\d+)/);
88
- if (!match) return [0, 0, 0];
89
- return [
90
- Number.parseInt(match[1], 10),
91
- Number.parseInt(match[2], 10),
92
- Number.parseInt(match[3], 10),
93
- ];
94
- };
95
-
96
- const [aMajor, aMinor, aPatch] = parseVersion(a);
97
- const [bMajor, bMinor, bPatch] = parseVersion(b);
98
-
99
- if (aMajor !== bMajor) return aMajor > bMajor ? 1 : -1;
100
- if (aMinor !== bMinor) return aMinor > bMinor ? 1 : -1;
101
- if (aPatch !== bPatch) return aPatch > bPatch ? 1 : -1;
102
- return 0;
103
- }
104
-
105
- /**
106
- * Get the installed skill version from the file
107
- */
108
- function getInstalledVersion(targetPath) {
109
- if (!existsSync(targetPath)) {
110
- return null;
111
- }
112
-
113
- try {
114
- const content = readFileSync(targetPath, 'utf8');
115
- const match = content.match(/^version:\s*["']?([^"'\n\r]+)/m);
116
- return match ? match[1].trim() : null;
117
- } catch {
118
- return null;
119
- }
120
- }
121
-
122
- /**
123
- * Get the skill name from YAML frontmatter, falling back to filename without .md
124
- */
125
- function getSkillName(filePath) {
126
- try {
127
- const content = readFileSync(filePath, 'utf8');
128
- const match = content.match(/^name:\s*["']?([^"'\n\r]+)/m);
129
- if (match) return match[1].trim();
130
- } catch {
131
- // Fall through to fallback
132
- }
133
- return basename(filePath, '.md');
134
- }
135
-
136
- /**
137
- * Get the package version from the skill source file
138
- */
139
- function getPackageVersion(sourcePath) {
140
- if (!existsSync(sourcePath)) {
141
- return null;
142
- }
143
-
144
- try {
145
- const content = readFileSync(sourcePath, 'utf8');
146
- const match = content.match(/^version:\s*["']?([^"'\n\r]+)/m);
147
- return match ? match[1].trim() : null;
148
- } catch {
149
- return null;
150
- }
151
- }
152
-
153
- /**
154
- * Find the project root by using INIT_CWD (set by npm/yarn/pnpm to the
155
- * directory where `install` was run), falling back to finding the
156
- * topmost node_modules in __dirname and taking its parent.
157
- */
158
57
  function findProjectRoot() {
159
58
  // INIT_CWD is the most reliable — npm, yarn, and pnpm all set it
160
59
  if (process.env.INIT_CWD) {
@@ -175,105 +74,20 @@ function findProjectRoot() {
175
74
  return join(__dirname, '..', '..', '..', '..');
176
75
  }
177
76
 
178
- /**
179
- * Main installation function
180
- */
181
- function install() {
182
- // Skip if needed
183
- if (shouldSkip()) {
184
- return;
185
- }
186
-
77
+ if (!shouldSkip()) {
187
78
  try {
188
- // Paths
189
- const skillsSourceDir = join(__dirname, '..', 'skills');
190
79
  const projectRoot = findProjectRoot();
191
- const skillsBaseDir = join(projectRoot, '.claude', 'skills');
192
-
193
- // Discover all *.md skill files
194
- if (!existsSync(skillsSourceDir)) {
195
- return;
196
- }
197
-
198
- const skillFiles = readdirSync(skillsSourceDir).filter((f) =>
199
- f.endsWith('.md')
200
- );
201
-
202
- if (skillFiles.length === 0) {
203
- return;
204
- }
205
-
206
- // Clean up legacy flat file structure (.claude/skills/ax/*.md except SKILL.md)
207
- const legacyDir = join(skillsBaseDir, 'ax');
208
- if (existsSync(legacyDir)) {
209
- try {
210
- const legacyFiles = readdirSync(legacyDir).filter(
211
- (f) => f.endsWith('.md') && f !== 'SKILL.md'
212
- );
213
- for (const f of legacyFiles) {
214
- rmSync(join(legacyDir, f), { force: true });
215
- }
216
- } catch {
217
- // Ignore cleanup errors
218
- }
219
- }
220
-
221
- const results = [];
222
-
223
- for (const file of skillFiles) {
224
- const skillSource = join(skillsSourceDir, file);
225
- const skillName = getSkillName(skillSource);
226
- const skillDir = join(skillsBaseDir, skillName);
227
- const skillTarget = join(skillDir, 'SKILL.md');
228
-
229
- const packageVersion = getPackageVersion(skillSource);
230
- const installedVersion = getInstalledVersion(skillTarget);
231
-
232
- let shouldInstallFile = false;
233
- let action = 'Installed';
234
- let versionInfo = '';
235
-
236
- if (!existsSync(skillTarget)) {
237
- shouldInstallFile = true;
238
- versionInfo = packageVersion ? ` (v${packageVersion})` : '';
239
- } else if (installedVersion && packageVersion) {
240
- const comparison = compareSemver(packageVersion, installedVersion);
241
- if (comparison > 0) {
242
- shouldInstallFile = true;
243
- action = 'Upgraded';
244
- versionInfo = ` (v${installedVersion} \u2192 v${packageVersion})`;
245
- }
246
- } else if (!installedVersion && existsSync(skillTarget)) {
247
- shouldInstallFile = true;
248
- action = 'Upgraded';
249
- versionInfo = packageVersion ? ` (v${packageVersion})` : '';
250
- }
251
-
252
- if (shouldInstallFile) {
253
- if (!existsSync(skillDir)) {
254
- mkdirSync(skillDir, { recursive: true });
255
- }
256
-
257
- const content = readFileSync(skillSource, 'utf8');
258
- writeFileSync(skillTarget, content, 'utf8');
259
- results.push({ file: skillName, action, versionInfo });
260
- }
261
- }
262
-
263
- if (results.length > 0 && isInteractive()) {
264
- const noun = results.length === 1 ? 'skill' : 'skills';
265
- const details = results
266
- .map((r) => `${r.action} ${r.file}${r.versionInfo}`)
267
- .join(', ');
80
+ const installed = autoSkillInstallEnabled(projectRoot)
81
+ ? installSkills(join(__dirname, '..'), projectRoot, {
82
+ upgradeInstalled: true,
83
+ })
84
+ : [];
85
+ if (installed.length > 0 && process.stdout.isTTY) {
268
86
  console.log(
269
- `\u2713 ${results.length} Ax Claude Code ${noun}: ${details}`
87
+ '✓ Ax skills updated; entry point includes local reference guides.'
270
88
  );
271
89
  }
272
90
  } catch {
273
- // Silent failure - never break npm install
274
- // The CLI command can be used for manual installation
91
+ // Manual recovery: npx @ax-llm/ax setup-claude
275
92
  }
276
93
  }
277
-
278
- // Run installation
279
- install();
@@ -0,0 +1,70 @@
1
+ import { readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ export function parseSkillFrontmatter(markdown) {
5
+ const text = markdown.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/)?.[1];
6
+ if (!text) return {};
7
+ const field = (key) =>
8
+ text.match(new RegExp(`^${key}:\\s*["']?(.+?)["']?\\s*$`, 'm'))?.[1];
9
+ return {
10
+ name: field('name'),
11
+ description: field('description'),
12
+ version: field('version'),
13
+ };
14
+ }
15
+
16
+ export function stripSkillFrontmatter(markdown) {
17
+ return markdown.replace(/^---\r?\n[\s\S]*?\r?\n---(?:\r?\n|$)(?:\r?\n)*/, '');
18
+ }
19
+
20
+ // The source docs remain independently installable. The entry point bundles
21
+ // those same docs as ordinary references, so only one skill needs registering.
22
+ export function readTypeScriptSkillBundles(skillsRoot, version) {
23
+ const sources = readdirSync(skillsRoot)
24
+ .filter((file) => file.endsWith('.md'))
25
+ .sort()
26
+ .map((file) => {
27
+ const content = readFileSync(join(skillsRoot, file), 'utf8').replace(
28
+ /^version:\s*["']?__VERSION__["']?/m,
29
+ `version: "${version}"`
30
+ );
31
+ const metadata = parseSkillFrontmatter(content);
32
+ if (!metadata.name || !metadata.description) {
33
+ throw new Error(`${file} is missing skill name or description`);
34
+ }
35
+ return { ...metadata, file, content };
36
+ });
37
+ const byFile = new Map(sources.map((skill) => [skill.file, skill]));
38
+ return sources.map((skill) => {
39
+ const files = {};
40
+ const addReference = (file) => {
41
+ const key = `references/${file}`;
42
+ if (files[key]) return;
43
+ const source = byFile.get(file);
44
+ if (!source) throw new Error(`Missing skill reference: ${file}`);
45
+ files[key] = stripSkillFrontmatter(source.content);
46
+ for (const match of files[key].matchAll(
47
+ /\]\((ax-[\w-]+\.md)(?:#[^)]*)?\)/g
48
+ )) {
49
+ addReference(match[1]);
50
+ }
51
+ };
52
+ const content = skill.content.replace(
53
+ /\]\((ax-[\w-]+\.md)((?:#[^)]*)?)\)/g,
54
+ (_, file, anchor) => {
55
+ addReference(file);
56
+ return `](references/${file}${anchor})`;
57
+ }
58
+ );
59
+ if (skill.name === 'ax-llm') {
60
+ for (const source of sources) {
61
+ if (source.name !== skill.name) addReference(source.file);
62
+ }
63
+ files['references/quickstart.md'] = readFileSync(
64
+ join(skillsRoot, 'references', 'quickstart.md'),
65
+ 'utf8'
66
+ );
67
+ }
68
+ return { ...skill, content, files: { 'SKILL.md': content, ...files } };
69
+ });
70
+ }
@@ -0,0 +1,59 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+
4
+ function isObject(value) {
5
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
6
+ }
7
+
8
+ function readProjectConfig(projectRoot) {
9
+ const file = join(projectRoot, 'package.json');
10
+ const source = readFileSync(file, 'utf8');
11
+ const config = JSON.parse(source);
12
+ if (
13
+ !isObject(config) ||
14
+ ('ax' in config && !isObject(config.ax)) ||
15
+ (config.ax && 'skills' in config.ax && !isObject(config.ax.skills)) ||
16
+ (config.ax?.skills &&
17
+ 'autoInstall' in config.ax.skills &&
18
+ typeof config.ax.skills.autoInstall !== 'boolean')
19
+ )
20
+ throw new Error(
21
+ 'Expected package.json ax.skills.autoInstall to be a boolean within ax and skills objects.'
22
+ );
23
+ return { file, source, config };
24
+ }
25
+
26
+ export function autoSkillInstallEnabled(projectRoot) {
27
+ try {
28
+ return (
29
+ readProjectConfig(projectRoot).config.ax?.skills?.autoInstall !== false
30
+ );
31
+ } catch (error) {
32
+ if (error.code === 'ENOENT') return true;
33
+ throw error;
34
+ }
35
+ }
36
+
37
+ export function setAutoSkillInstall(projectRoot, enabled) {
38
+ let project;
39
+ try {
40
+ project = readProjectConfig(projectRoot);
41
+ } catch (error) {
42
+ if (error.code === 'ENOENT')
43
+ throw new Error(
44
+ 'No package.json found. Run this command from your project root.'
45
+ );
46
+ throw error;
47
+ }
48
+ const { file, source, config } = project;
49
+ config.ax ??= {};
50
+ config.ax.skills ??= {};
51
+ config.ax.skills.autoInstall = enabled;
52
+ const indent = source.match(/^[\t ]+(?=")/m)?.[0] ?? 2;
53
+ const newline = source.includes('\r\n') ? '\r\n' : '\n';
54
+ const content = JSON.stringify(config, null, indent).replaceAll(
55
+ '\n',
56
+ newline
57
+ );
58
+ writeFileSync(file, content + (source.endsWith('\n') ? newline : ''), 'utf8');
59
+ }
@@ -0,0 +1,123 @@
1
+ import {
2
+ existsSync,
3
+ mkdirSync,
4
+ readdirSync,
5
+ readFileSync,
6
+ rmdirSync,
7
+ rmSync,
8
+ writeFileSync,
9
+ } from 'node:fs';
10
+ import { dirname, join } from 'node:path';
11
+ import {
12
+ parseSkillFrontmatter,
13
+ readTypeScriptSkillBundles,
14
+ } from './skill-bundles.mjs';
15
+
16
+ function packageSkills(packageRoot) {
17
+ const { version } = JSON.parse(
18
+ readFileSync(join(packageRoot, 'package.json'), 'utf8')
19
+ );
20
+ return readTypeScriptSkillBundles(join(packageRoot, 'skills'), version);
21
+ }
22
+
23
+ function compareVersions(a, b) {
24
+ const parts = (value) =>
25
+ value
26
+ .match(/^(\d+)\.(\d+)\.(\d+)/)
27
+ ?.slice(1)
28
+ .map(Number) ?? [0, 0, 0];
29
+ const left = parts(a);
30
+ const right = parts(b);
31
+ for (let i = 0; i < 3; i++) {
32
+ if (left[i] !== right[i]) return left[i] > right[i] ? 1 : -1;
33
+ }
34
+ return 0;
35
+ }
36
+
37
+ export function installSkills(
38
+ packageRoot,
39
+ projectRoot,
40
+ { all = false, names = [], force = false, upgradeInstalled = false } = {}
41
+ ) {
42
+ const skills = packageSkills(packageRoot);
43
+ const selectedNames = all
44
+ ? skills.map((skill) => skill.name)
45
+ : names.length
46
+ ? names
47
+ : ['ax-llm'];
48
+ if (upgradeInstalled) {
49
+ for (const skill of skills) {
50
+ if (
51
+ existsSync(
52
+ join(projectRoot, '.claude', 'skills', skill.name, 'SKILL.md')
53
+ ) &&
54
+ !selectedNames.includes(skill.name)
55
+ ) {
56
+ selectedNames.push(skill.name);
57
+ }
58
+ }
59
+ }
60
+ for (const name of selectedNames) {
61
+ if (!skills.some((skill) => skill.name === name))
62
+ throw new Error(`Unknown Ax skill: ${name}`);
63
+ }
64
+ const results = [];
65
+ // Keep the default entry point ahead of optional upgrades, so a broken
66
+ // specialist folder cannot prevent the main capability index installing.
67
+ for (const name of new Set(selectedNames)) {
68
+ const skill = skills.find((entry) => entry.name === name);
69
+ const dir = join(projectRoot, '.claude', 'skills', skill.name);
70
+ const target = join(dir, 'SKILL.md');
71
+ const installed = existsSync(target)
72
+ ? parseSkillFrontmatter(readFileSync(target, 'utf8')).version
73
+ : undefined;
74
+ const comparison = installed
75
+ ? compareVersions(skill.version, installed)
76
+ : 1;
77
+ // Refresh equal-version legacy installs which predate bundled references.
78
+ const missingFiles = Object.keys(skill.files).some(
79
+ (file) => !existsSync(join(dir, file))
80
+ );
81
+ if (!force && (comparison < 0 || (comparison === 0 && !missingFiles)))
82
+ continue;
83
+ for (const [file, content] of Object.entries(skill.files)) {
84
+ if (file === 'SKILL.md') continue;
85
+ const dest = join(dir, file);
86
+ mkdirSync(dirname(dest), { recursive: true });
87
+ writeFileSync(dest, content, 'utf8');
88
+ }
89
+ // Register the skill only after every guide was successfully written.
90
+ mkdirSync(dir, { recursive: true });
91
+ writeFileSync(target, skill.content, 'utf8');
92
+ results.push(skill.name);
93
+ }
94
+ return results;
95
+ }
96
+
97
+ // Remove only package-defined files, preserving unrelated files in skill folders.
98
+ export function removeSkills(packageRoot, projectRoot) {
99
+ const skills = packageSkills(packageRoot);
100
+ const base = join(projectRoot, '.claude', 'skills');
101
+ let removed = 0;
102
+ for (const skill of skills) {
103
+ const dir = join(base, skill.name);
104
+ if (existsSync(join(dir, 'SKILL.md'))) removed++;
105
+ for (const file of Object.keys(skill.files))
106
+ rmSync(join(dir, file), { force: true });
107
+ for (const folder of ['references', '']) {
108
+ try {
109
+ rmdirSync(join(dir, folder));
110
+ } catch {
111
+ /* Keep nonempty folders. */
112
+ }
113
+ }
114
+ }
115
+ const legacy = join(base, 'ax');
116
+ if (existsSync(legacy)) {
117
+ for (const file of readdirSync(legacy)) {
118
+ if (skills.some((skill) => skill.file === file))
119
+ rmSync(join(legacy, file), { force: true });
120
+ }
121
+ }
122
+ return removed;
123
+ }
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent-context
3
3
  description: This skill helps an LLM pick the right AxAgent context tool for a job - contextMap for recurring corpora, contextPolicy presets for within-run trajectory compaction, agent.optimize for offline GEPA instruction/demo tuning, agent.playbook for an evolving context playbook (offline evolve + online update), and recall/memories + skills for per-turn retrieval. Use when the user asks "which context feature should I use", confuses contextMap with contextPolicy or memory, or wants a decision guide for long-context agents. For contextPolicy/contextMap codegen use ax-agent-rlm; for recall/skills use ax-agent-memory-skills; for agent.optimize or agent.playbook use ax-agent-optimize.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent Context Selection (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent-memory-skills
3
3
  description: This skill helps an LLM generate correct AxAgent memory retrieval, context-map, and dynamic skill-loading code using @ax-llm/ax. Use when the user asks about contextMap, AxAgentContextMap, onMemoriesSearch, memoriesCatalog, recall(...), inputs.memories, onLoadedMemories, onUsedMemories, onSkillsSearch, skillsCatalog, AxAgentCatalogSkill, discover({ skills }), onLoadedSkills, onUsedSkills, preloaded skills, preloading memories at forward time, relevanceRanking hints, loaded memory/skill IDs, or carrying memories across forward() calls.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent Memory And Skills Rules (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent-observability
3
3
  description: This skill helps an LLM generate correct AxAgent observability code using @ax-llm/ax. Use when the user asks about axGlobals.onUsage, usageContext, centralized or multi-tenant usage accounting, actorTurnCallback, onContextEvent, agentStatusCallback, onFunctionCall, reportSuccess, reportFailure, getChatLog(), getUsage(), resetUsage(), debug traces, progress updates, or telemetry for AxAgent runs.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent Observability Rules (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent-optimize
3
3
  description: This skill helps an LLM generate correct AxAgent tuning and evaluation code using @ax-llm/ax. Use when the user asks about agent.optimize(...), judgeOptions, eval datasets, optimization targets, saved optimizedProgram artifacts, or agent optimization guidance.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent Optimize Codegen Rules (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent-rlm
3
3
  description: This skill helps an LLM generate correct AxAgent RLM/runtime code using @ax-llm/ax. Use when the user asks about RLM code execution, AxJSRuntime, contextFields, contextPolicy, liveRuntimeState, promptLevel, stage prompt controls, executorModelPolicy, maxRuntimeChars, agent.test(...), llmQuery(...), recursionOptions, or long-running agent runtime behavior.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent RLM Runtime Rules (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-agent
3
3
  description: This skill helps an LLM generate correct core AxAgent code using @ax-llm/ax. Use when the user asks about agent(), child agents, namespaced functions, discovery mode, clarification, bubbleErrors, host-side final/clarification protocol, or ordinary agent runtime behavior. For MCP clients, native runtime modules, subscriptions, tasks, or authentication use ax-mcp alongside this skill. For RLM/code-runtime work use ax-agent-rlm; for callbacks and telemetry use ax-agent-observability; for recall/memory/skill loading use ax-agent-memory-skills; for agent.optimize(...) use ax-agent-optimize.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxAgent Codegen Rules (@ax-llm/ax)
package/skills/ax-ai.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-ai
3
3
  description: This skill helps an LLM generate correct AI provider setup and configuration code using @ax-llm/ax. Use when the user asks about ai(), providers, models, routing, adaptive balancing, presets, embeddings, batch audio with ai.transcribe() or ai.speak(), extended thinking, context caching, or mentions OpenAI/Anthropic/Google/Azure/DeepSeek/Meta/Mistral/Cohere/Reka/Grok/Typesafe/Jev with @ax-llm/ax.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AI Provider Codegen Rules (@ax-llm/ax)
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-audio
3
3
  description: This skill helps an LLM generate correct audio code with @ax-llm/ax. Use when the user asks about ai.transcribe(), ai.speak(), signature audio inputs or outputs, agent audio behavior, .chat() conversational audio, OpenAI audio or realtime models, Gemini Live native audio, Grok Voice Agent models, voices, formats, transcripts, or how audio fits with structured outputs.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # Audio I/O Codegen Rules (@ax-llm/ax)
package/skills/ax-flow.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-flow
3
3
  description: This skill helps an LLM generate correct AxFlow workflow code using @ax-llm/ax. Use when the user asks about flow(), AxFlow, workflow orchestration, parallel execution, DAG workflows, conditional routing, map/reduce patterns, or multi-node AI pipelines.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxFlow Codegen Rules (@ax-llm/ax)
package/skills/ax-gen.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-gen
3
3
  description: This skill helps an LLM generate correct AxGen code using @ax-llm/ax. Use when the user asks about ax(), AxGen, generators, forward(), streamingForward(), validation, assertions, streaming assertions, field processors, step hooks, self-tuning, or structured outputs. For MCP clients, transports, prompts, resources, tasks, subscriptions, or authentication use ax-mcp alongside this skill.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # AxGen Codegen Rules (@ax-llm/ax)
package/skills/ax-gepa.md CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ax-gepa
3
3
  description: This skill helps an LLM generate correct AxGEPA optimization code using @ax-llm/ax. Use when the user asks about AxGEPA, GEPA, Pareto optimization, multi-objective prompt tuning, reflective prompt evolution, validationExamples, maxMetricCalls, or optimizing a generator, flow, or agent tree.
4
- version: "25.4.0"
4
+ version: "25.4.2"
5
5
  ---
6
6
 
7
7
  # GEPA Optimization Codegen Rules (@ax-llm/ax)