@mistralys/persona-builder 2.4.0 → 2.5.0

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/dist/index.d.cts CHANGED
@@ -179,6 +179,26 @@ declare function serializeTools(tools: string[]): string;
179
179
  * serializeToolsList([]) // => ""
180
180
  */
181
181
  declare function serializeToolsList(tools: string[]): string;
182
+ /**
183
+ * Serialize a tools array as a YAML block sequence.
184
+ *
185
+ * Output format (non-empty):
186
+ * `\n - tool1\n - tool2`
187
+ *
188
+ * Output format (empty):
189
+ * ` []`
190
+ *
191
+ * Designed for use in frontmatter templates as `tools:{{tools_block}}`
192
+ * (no space between the colon and the variable).
193
+ *
194
+ * @param tools - Array of tool name strings
195
+ * @returns YAML block sequence string (includes leading newline for non-empty arrays)
196
+ *
197
+ * @example
198
+ * serializeToolsBlock(['Bash', 'Read']) // => "\n - Bash\n - Read"
199
+ * serializeToolsBlock([]) // => " []"
200
+ */
201
+ declare function serializeToolsBlock(tools: string[]): string;
182
202
 
183
203
  /**
184
204
  * src/loaders/partials-loader.ts
@@ -256,6 +276,14 @@ interface PersonaMetadata {
256
276
  version?: string;
257
277
  /** Ordered list of tool identifiers */
258
278
  tools?: string[];
279
+ /**
280
+ * Optional list of persona slugs this persona delegates to as sub-agents.
281
+ *
282
+ * Each entry is a kebab-case slug referencing another persona in any
283
+ * configured suite. Validated during build against the cross-suite agent
284
+ * map — an unknown slug produces an error-severity `ValidationResult`.
285
+ */
286
+ subagents?: string[];
259
287
  /** Free-form context variables available during template rendering */
260
288
  [key: string]: unknown;
261
289
  }
@@ -740,7 +768,7 @@ declare const DEFAULT_FRONTMATTER_VSCODE = "---\nname: '{{name}} v{{version}}'\n
740
768
  * Minimal fields that work for standalone personas. Projects using numbered
741
769
  * workflows should inject a richer template via a plugin.
742
770
  */
743
- declare const DEFAULT_FRONTMATTER_CLAUDE_CODE = "---\nname: {{cc_file_name_stem}}\npermissionMode: {{cc_permission_mode}}\nmodel: {{cc_model}}\nmemory: {{cc_memory}}\nallowedTools: [{{cc_tools_list}}]\n---";
771
+ declare const DEFAULT_FRONTMATTER_CLAUDE_CODE = "---\nname: {{cc_file_name_stem}}\ndescription: {{description}}\nmodel: {{cc_model}}\nmemory: {{cc_memory}}\ntools:{{cc_tools_block}}\n---";
744
772
  /**
745
773
  * Default Deep Agents frontmatter template.
746
774
  *
@@ -1308,4 +1336,4 @@ declare const defaultRegistry: TargetRegistry;
1308
1336
 
1309
1337
  declare const VERSION: string;
1310
1338
 
1311
- export { type BuildConfig, type BuildResult, type BuildSummary, DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, type PersonaBuildPlugin, type PersonaMetadata, type SuiteConfig, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, type TargetDefinition, TargetRegistry, type TargetType, VERSION, type ValidationResult, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsList, validateFileName, validateStrictMarkers };
1339
+ export { type BuildConfig, type BuildResult, type BuildSummary, DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, type PersonaBuildPlugin, type PersonaMetadata, type SuiteConfig, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, type TargetDefinition, TargetRegistry, type TargetType, VERSION, type ValidationResult, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsBlock, serializeToolsList, validateFileName, validateStrictMarkers };
package/dist/index.d.ts CHANGED
@@ -179,6 +179,26 @@ declare function serializeTools(tools: string[]): string;
179
179
  * serializeToolsList([]) // => ""
180
180
  */
181
181
  declare function serializeToolsList(tools: string[]): string;
182
+ /**
183
+ * Serialize a tools array as a YAML block sequence.
184
+ *
185
+ * Output format (non-empty):
186
+ * `\n - tool1\n - tool2`
187
+ *
188
+ * Output format (empty):
189
+ * ` []`
190
+ *
191
+ * Designed for use in frontmatter templates as `tools:{{tools_block}}`
192
+ * (no space between the colon and the variable).
193
+ *
194
+ * @param tools - Array of tool name strings
195
+ * @returns YAML block sequence string (includes leading newline for non-empty arrays)
196
+ *
197
+ * @example
198
+ * serializeToolsBlock(['Bash', 'Read']) // => "\n - Bash\n - Read"
199
+ * serializeToolsBlock([]) // => " []"
200
+ */
201
+ declare function serializeToolsBlock(tools: string[]): string;
182
202
 
183
203
  /**
184
204
  * src/loaders/partials-loader.ts
@@ -256,6 +276,14 @@ interface PersonaMetadata {
256
276
  version?: string;
257
277
  /** Ordered list of tool identifiers */
258
278
  tools?: string[];
279
+ /**
280
+ * Optional list of persona slugs this persona delegates to as sub-agents.
281
+ *
282
+ * Each entry is a kebab-case slug referencing another persona in any
283
+ * configured suite. Validated during build against the cross-suite agent
284
+ * map — an unknown slug produces an error-severity `ValidationResult`.
285
+ */
286
+ subagents?: string[];
259
287
  /** Free-form context variables available during template rendering */
260
288
  [key: string]: unknown;
261
289
  }
@@ -740,7 +768,7 @@ declare const DEFAULT_FRONTMATTER_VSCODE = "---\nname: '{{name}} v{{version}}'\n
740
768
  * Minimal fields that work for standalone personas. Projects using numbered
741
769
  * workflows should inject a richer template via a plugin.
742
770
  */
743
- declare const DEFAULT_FRONTMATTER_CLAUDE_CODE = "---\nname: {{cc_file_name_stem}}\npermissionMode: {{cc_permission_mode}}\nmodel: {{cc_model}}\nmemory: {{cc_memory}}\nallowedTools: [{{cc_tools_list}}]\n---";
771
+ declare const DEFAULT_FRONTMATTER_CLAUDE_CODE = "---\nname: {{cc_file_name_stem}}\ndescription: {{description}}\nmodel: {{cc_model}}\nmemory: {{cc_memory}}\ntools:{{cc_tools_block}}\n---";
744
772
  /**
745
773
  * Default Deep Agents frontmatter template.
746
774
  *
@@ -1308,4 +1336,4 @@ declare const defaultRegistry: TargetRegistry;
1308
1336
 
1309
1337
  declare const VERSION: string;
1310
1338
 
1311
- export { type BuildConfig, type BuildResult, type BuildSummary, DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, type PersonaBuildPlugin, type PersonaMetadata, type SuiteConfig, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, type TargetDefinition, TargetRegistry, type TargetType, VERSION, type ValidationResult, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsList, validateFileName, validateStrictMarkers };
1339
+ export { type BuildConfig, type BuildResult, type BuildSummary, DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, type PersonaBuildPlugin, type PersonaMetadata, type SuiteConfig, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, type TargetDefinition, TargetRegistry, type TargetType, VERSION, type ValidationResult, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsBlock, serializeToolsList, validateFileName, validateStrictMarkers };
package/dist/index.js CHANGED
@@ -95,6 +95,10 @@ function serializeTools(tools) {
95
95
  function serializeToolsList(tools) {
96
96
  return tools.map((t) => `'${t}'`).join(", ");
97
97
  }
98
+ function serializeToolsBlock(tools) {
99
+ if (tools.length === 0) return " []";
100
+ return "\n" + tools.map((t) => ` - ${t}`).join("\n");
101
+ }
98
102
  async function loadPartials(dir) {
99
103
  const entries = await readdir(dir, { withFileTypes: true });
100
104
  const mdFiles = entries.filter(
@@ -203,10 +207,10 @@ tools: [{{tools_list}}]
203
207
  ---`;
204
208
  var DEFAULT_FRONTMATTER_CLAUDE_CODE = `---
205
209
  name: {{cc_file_name_stem}}
206
- permissionMode: {{cc_permission_mode}}
210
+ description: {{description}}
207
211
  model: {{cc_model}}
208
212
  memory: {{cc_memory}}
209
- allowedTools: [{{cc_tools_list}}]
213
+ tools:{{cc_tools_block}}
210
214
  ---`;
211
215
  var DEFAULT_FRONTMATTER_DEEP_AGENTS = `---
212
216
  name: {{name}}
@@ -435,6 +439,12 @@ function buildContext(options) {
435
439
  if (!("cc_tools_json" in merged)) {
436
440
  merged["cc_tools_json"] = serializeTools(ccTools);
437
441
  }
442
+ if (!("tools_block" in merged)) {
443
+ merged["tools_block"] = serializeToolsBlock(tools);
444
+ }
445
+ if (!("cc_tools_block" in merged)) {
446
+ merged["cc_tools_block"] = serializeToolsBlock(ccTools);
447
+ }
438
448
  if (!("cc_file_name_stem" in merged) && typeof merged["cc_file_name"] === "string") {
439
449
  const ccFileName = merged["cc_file_name"];
440
450
  merged["cc_file_name_stem"] = ccFileName.replace(/\.md$/, "");
@@ -451,6 +461,9 @@ function buildContext(options) {
451
461
  if (!("da_tools_json" in merged)) {
452
462
  merged["da_tools_json"] = serializeTools(daTools);
453
463
  }
464
+ if (!("da_tools_block" in merged)) {
465
+ merged["da_tools_block"] = serializeToolsBlock(daTools);
466
+ }
454
467
  }
455
468
  for (const [key, value] of Object.entries(agentMap)) {
456
469
  if (!(key in merged)) {
@@ -469,6 +482,21 @@ function buildContext(options) {
469
482
  }
470
483
  return merged;
471
484
  }
485
+ function validateSubagentRefs(persona, agentMap) {
486
+ const subagents = persona.subagents;
487
+ if (!Array.isArray(subagents) || subagents.length === 0) return [];
488
+ const results = [];
489
+ for (const slug of subagents) {
490
+ const key = `agent_slug_${slug.replace(/-/g, "_")}`;
491
+ if (!(key in agentMap)) {
492
+ results.push({
493
+ severity: "error",
494
+ message: `Persona '${persona.name}' declares subagent '${slug}' but no persona with that slug exists in any configured suite.`
495
+ });
496
+ }
497
+ }
498
+ return results;
499
+ }
472
500
  async function buildPersona(personaYamlPath, suiteName, suiteConfig, sharedMeta, partialsMap, config, plugins, target, agentMap = {}, registry = defaultRegistry) {
473
501
  const personaMeta = await loadPersonaYaml(personaYamlPath);
474
502
  let context = buildContext({
@@ -507,7 +535,10 @@ async function buildPersona(personaYamlPath, suiteName, suiteConfig, sharedMeta,
507
535
  ${body}
508
536
  `);
509
537
  output = runPostRender(plugins, output, personaMetaTyped, target);
510
- const validationResults = runValidate(plugins, personaMetaTyped, suiteConfig, target);
538
+ const validationResults = [
539
+ ...runValidate(plugins, personaMetaTyped, suiteConfig, target),
540
+ ...validateSubagentRefs(personaMetaTyped, agentMap)
541
+ ];
511
542
  const def = registry.has(target) ? registry.get(target) : void 0;
512
543
  const outputDir = resolveOutputDir(target, suiteConfig, def);
513
544
  const fnKey = def?.filenameContextKey;
@@ -660,6 +691,6 @@ function escapeRegExp(str) {
660
691
  var _pkgRequire = createRequire(import.meta.url);
661
692
  var VERSION = _pkgRequire("../package.json").version;
662
693
 
663
- export { DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, TargetRegistry, VERSION, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsList, validateFileName, validateStrictMarkers };
694
+ export { DEFAULT_FRONTMATTER_CLAUDE_CODE, DEFAULT_FRONTMATTER_DEEP_AGENTS, DEFAULT_FRONTMATTER_VSCODE, TARGET_CLAUDE_CODE, TARGET_DEEP_AGENTS, TARGET_VSCODE, TargetRegistry, VERSION, build, buildPersona, buildSuite, collapseBlankLines, defaultRegistry, discoverPersonaYamls, ensureBlankLineBeforeHeadings, escapeRegExp, loadContent, loadMetadata, loadPartials, normalizeNewlines, renderFrontmatter, resolveConditionals, resolveFrontmatterTemplate, resolvePartials, resolveVariables, runBuildContext, runPartials, runPersonaPartials, runPostRender, runSuiteInit, runValidate, serializeTools, serializeToolsBlock, serializeToolsList, validateFileName, validateStrictMarkers };
664
695
  //# sourceMappingURL=index.js.map
665
696
  //# sourceMappingURL=index.js.map