@forwardimpact/schema 0.8.2 → 0.9.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.
@@ -28,8 +28,11 @@ assessmentWeights:
28
28
  # Agent-specific content
29
29
  agent:
30
30
  identity: |
31
- You are a Platform {roleTitle} agent. Your primary focus is
31
+ You are a Platform {roleTitle} agent. Your primary focus is
32
32
  building self-service capabilities that enable other engineers.
33
+ You treat checklists the way surgeons and pilots do—not as a
34
+ crutch, but as a discipline that catches the errors expertise
35
+ alone cannot prevent.
33
36
  priority: |
34
37
  Developer experience is paramount. You design golden paths, maintain
35
38
  backward compatibility, and document everything. Code quality and
@@ -27,8 +27,11 @@ assessmentWeights:
27
27
  # Agent-specific content
28
28
  agent:
29
29
  identity: |
30
- You are an SRE {roleTitle} agent. Your primary focus is
31
- system reliability, observability, and incident response.
30
+ You are an SRE {roleTitle} agent. Your primary focus is
31
+ system reliability, observability, and incident response. You
32
+ treat checklists the way surgeons and pilots do—not as a crutch,
33
+ but as a discipline that catches the errors expertise alone
34
+ cannot prevent.
32
35
  priority: |
33
36
  Reliability is non-negotiable. You instrument everything, design for
34
37
  graceful degradation, and maintain error budgets. Every change
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forwardimpact/schema",
3
- "version": "0.8.2",
3
+ "version": "0.9.0",
4
4
  "description": "Schema definitions and data loading for skills, behaviours, and role frameworks",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -89,14 +89,22 @@
89
89
  "$ref": "#/$defs/skillAgentSection",
90
90
  "description": "Agent-specific content for the skill"
91
91
  },
92
- "implementationReference": {
93
- "type": "string",
94
- "description": "Implementation patterns and code examples in markdown format (shared by human and agent)"
95
- },
96
92
  "toolReferences": {
97
93
  "type": "array",
98
94
  "description": "Required tools for this skill",
99
95
  "items": { "$ref": "#/$defs/toolReference" }
96
+ },
97
+ "instructions": {
98
+ "type": "string",
99
+ "description": "Step-by-step workflow guidance for the main SKILL.md body"
100
+ },
101
+ "installScript": {
102
+ "type": "string",
103
+ "description": "Shell commands for environment setup, exported to scripts/install.sh"
104
+ },
105
+ "implementationReference": {
106
+ "type": "string",
107
+ "description": "Code examples and detailed reference material, exported to references/REFERENCE.md"
100
108
  }
101
109
  },
102
110
  "additionalProperties": false
@@ -77,9 +77,21 @@ fit:levelDescriptions a rdf:Property ;
77
77
  rdfs:comment "Description of expectations at each level"@en ;
78
78
  rdfs:range fit:LevelDescriptions .
79
79
 
80
+ fit:instructions a rdf:Property ;
81
+ rdfs:label "instructions"@en ;
82
+ rdfs:comment "Step-by-step workflow guidance for the main SKILL.md body"@en ;
83
+ rdfs:domain fit:Skill ;
84
+ rdfs:range xsd:string .
85
+
86
+ fit:installScript a rdf:Property ;
87
+ rdfs:label "installScript"@en ;
88
+ rdfs:comment "Shell commands for environment setup, exported to scripts/install.sh"@en ;
89
+ rdfs:domain fit:Skill ;
90
+ rdfs:range xsd:string .
91
+
80
92
  fit:implementationReference a rdf:Property ;
81
93
  rdfs:label "implementationReference"@en ;
82
- rdfs:comment "Implementation patterns and code examples in markdown format"@en ;
94
+ rdfs:comment "Code examples and detailed reference material, exported to references/REFERENCE.md"@en ;
83
95
  rdfs:domain fit:Skill ;
84
96
  rdfs:range xsd:string .
85
97
 
@@ -277,18 +289,32 @@ fit:SkillShape a sh:NodeShape ;
277
289
  sh:name "agent" ;
278
290
  sh:description "Agent-specific content for the skill" ;
279
291
  ] ;
280
- sh:property [
281
- sh:path fit:implementationReference ;
282
- sh:datatype xsd:string ;
283
- sh:maxCount 1 ;
284
- sh:name "implementationReference" ;
285
- sh:description "Implementation patterns and code examples in markdown format" ;
286
- ] ;
287
292
  sh:property [
288
293
  sh:path fit:toolReferences ;
289
294
  sh:node fit:ToolReferenceShape ;
290
295
  sh:name "toolReferences" ;
291
296
  sh:description "Required tools for this skill" ;
297
+ ] ;
298
+ sh:property [
299
+ sh:path fit:instructions ;
300
+ sh:datatype xsd:string ;
301
+ sh:maxCount 1 ;
302
+ sh:name "instructions" ;
303
+ sh:description "Step-by-step workflow guidance for the main SKILL.md body" ;
304
+ ] ;
305
+ sh:property [
306
+ sh:path fit:installScript ;
307
+ sh:datatype xsd:string ;
308
+ sh:maxCount 1 ;
309
+ sh:name "installScript" ;
310
+ sh:description "Shell commands for environment setup, exported to scripts/install.sh" ;
311
+ ] ;
312
+ sh:property [
313
+ sh:path fit:implementationReference ;
314
+ sh:datatype xsd:string ;
315
+ sh:maxCount 1 ;
316
+ sh:name "implementationReference" ;
317
+ sh:description "Code examples and detailed reference material, exported to references/REFERENCE.md" ;
292
318
  ] .
293
319
 
294
320
  # -----------------------------------------------------------------------------
package/src/loader.js CHANGED
@@ -90,6 +90,8 @@ async function loadSkillsFromCapabilities(capabilitiesDir) {
90
90
  isHumanOnly,
91
91
  human,
92
92
  agent,
93
+ instructions,
94
+ installScript,
93
95
  implementationReference,
94
96
  toolReferences,
95
97
  } = skill;
@@ -103,6 +105,9 @@ async function loadSkillsFromCapabilities(capabilitiesDir) {
103
105
  ...(isHumanOnly && { isHumanOnly }),
104
106
  // Preserve agent section for agent generation
105
107
  ...(agent && { agent }),
108
+ // Include agent skill content fields
109
+ ...(instructions && { instructions }),
110
+ ...(installScript && { installScript }),
106
111
  // Include implementation reference and tool references (shared by human and agent)
107
112
  ...(implementationReference && { implementationReference }),
108
113
  ...(toolReferences && { toolReferences }),
package/src/validation.js CHANGED
@@ -307,6 +307,50 @@ function validateSkill(skill, index, requiredStageIds = []) {
307
307
  );
308
308
  }
309
309
 
310
+ // Validate instructions if present (optional string)
311
+ if (
312
+ skill.instructions !== undefined &&
313
+ typeof skill.instructions !== "string"
314
+ ) {
315
+ errors.push(
316
+ createError(
317
+ "INVALID_VALUE",
318
+ "Skill instructions must be a string",
319
+ `${path}.instructions`,
320
+ skill.instructions,
321
+ ),
322
+ );
323
+ }
324
+
325
+ // Validate installScript if present (optional string)
326
+ if (
327
+ skill.installScript !== undefined &&
328
+ typeof skill.installScript !== "string"
329
+ ) {
330
+ errors.push(
331
+ createError(
332
+ "INVALID_VALUE",
333
+ "Skill installScript must be a string",
334
+ `${path}.installScript`,
335
+ skill.installScript,
336
+ ),
337
+ );
338
+ }
339
+
340
+ // Error if implementationReference still contains <onboarding_steps> tags (migration aid)
341
+ if (
342
+ typeof skill.implementationReference === "string" &&
343
+ skill.implementationReference.includes("<onboarding_steps>")
344
+ ) {
345
+ errors.push(
346
+ createError(
347
+ "INVALID_FIELD",
348
+ "Skill implementationReference contains <onboarding_steps> tags. Extract install commands to skill.installScript instead.",
349
+ `${path}.implementationReference`,
350
+ ),
351
+ );
352
+ }
353
+
310
354
  // Validate toolReferences array if present
311
355
  if (skill.toolReferences !== undefined) {
312
356
  if (!Array.isArray(skill.toolReferences)) {