All files / src/skill-builder skill-contract.ts

100% Statements 7/7
100% Branches 0/0
100% Functions 1/1
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100                                  3x                 3x                                                 3x                   3x             3x                                                     3x 3x      
import { z } from 'zod';
import type { UsageStats } from '../types/index.js';
 
export interface SkillBuildExternalSource {
  title: string;
  url: string;
  reason: string;
}
 
export interface SkillBuildAuthoringProvider {
  name: string;
  rootDir: string;
  contentHash: string;
}
 
export type GeneratedSkillAuthoringMode = 'build' | 'improve';
 
const SkillBuildExternalSourceSchema = z.object({
  title: z.string().min(1),
  url: z.string().min(1),
  reason: z.string().min(1),
}).strict();
 
// The authoring plan is meant to describe semantic coverage, source depth,
// ordered work, and review criteria. It must not become an artifact-layout
// plan; the authoring skill owns artifact placement and routing choices.
export const GeneratedSkillAuthoringPlanSchema = z.object({
  version: z.literal(1),
  summary: z.string().min(1),
  workflow: z.array(z.string().min(1)).min(1),
  researchPlan: z.array(z.string().min(1)).default([]),
  sourceDecisions: z.array(z.object({
    source: z.string().min(1),
    decision: z.string().min(1),
    implication: z.string().min(1),
  }).strict()).default([]),
  lookupQuestions: z.array(z.object({
    question: z.string().min(1),
    openWhen: z.string().min(1),
    requiredEvidence: z.array(z.string().min(1)).min(1),
  }).strict()).default([]),
  qualityBar: z.array(z.string().min(1)).default([]),
  artifactPlan: z.array(z.string().min(1)).min(1),
  validationPlan: z.array(z.string().min(1)).min(1),
  risks: z.array(z.string().min(1)).default([]),
  missingInputs: z.array(z.string().min(1)).default([]),
  externalSources: z.array(SkillBuildExternalSourceSchema).default([]),
}).strict();
 
export type GeneratedSkillAuthoringPlan = z.infer<typeof GeneratedSkillAuthoringPlanSchema>;
 
export const GeneratedSkillWriterResultSchema = z.object({
  version: z.literal(1),
  summary: z.string().min(1),
  validationNotes: z.array(z.string().min(1)).default([]),
  missingInputs: z.array(z.string().min(1)).default([]),
  externalSources: z.array(SkillBuildExternalSourceSchema).default([]),
});
 
export type GeneratedSkillWriterResult = z.infer<typeof GeneratedSkillWriterResultSchema>;
 
export const GeneratedSkillReviewIssueSchema = z.object({
  severity: z.enum(['error', 'warning']),
  path: z.string().optional(),
  message: z.string().min(1),
  suggestedFix: z.string().optional(),
}).strict();
 
export const GeneratedSkillReviewResultSchema = z.object({
  version: z.literal(1),
  valid: z.boolean(),
  summary: z.string().min(1),
  issues: z.array(GeneratedSkillReviewIssueSchema).default([]),
  missingInputs: z.array(z.string().min(1)).default([]),
}).strict();
 
export type GeneratedSkillReviewResult = z.infer<typeof GeneratedSkillReviewResultSchema>;
 
export interface GeneratedSkillArtifact {
  kind: 'generated-skill';
  source: 'cache' | 'generated';
  name: string;
  path: string;
  bytes: number;
  durationMs: number;
  usage: UsageStats;
  externalSources: SkillBuildExternalSource[];
  missingInputs: string[];
  warnings: string[];
  responseModel?: string;
  numTurns?: number;
}
 
export class GeneratedSkillBuildError extends Error {
  constructor(message: string, options?: { cause?: unknown }) {
    super(message, options);
    this.name = 'GeneratedSkillBuildError';
  }
}