@soleri/forge 9.8.0 → 9.10.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.
@@ -1 +1 @@
1
- {"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared-rules.js","sourceRoot":"","sources":["../../src/templates/shared-rules.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soleri/forge",
3
- "version": "9.8.0",
3
+ "version": "9.10.0",
4
4
  "description": "Scaffold AI agents that learn, remember, and grow with you.",
5
5
  "keywords": [
6
6
  "agent",
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Tests for compose-claude-md.ts — user custom zone helpers.
3
+ */
4
+
5
+ import { describe, it, expect } from 'vitest';
6
+ import { extractUserCustomZone, injectUserCustomZone } from '../compose-claude-md.js';
7
+
8
+ const OPEN = '<!-- user:custom -->';
9
+ const CLOSE = '<!-- /user:custom -->';
10
+
11
+ describe('extractUserCustomZone', () => {
12
+ it('extracts full block between user:custom markers', () => {
13
+ const content = ['# Agent', OPEN, 'My custom rules here', CLOSE, '## Footer'].join('\n');
14
+ const result = extractUserCustomZone(content);
15
+ expect(result).toContain(OPEN);
16
+ expect(result).toContain('My custom rules here');
17
+ expect(result).toContain(CLOSE);
18
+ });
19
+
20
+ it('returns null when no markers present', () => {
21
+ expect(extractUserCustomZone('# Just a normal file\nNo markers.')).toBeNull();
22
+ });
23
+
24
+ it('returns null for malformed markers (start without end)', () => {
25
+ const content = `# Agent\n${OPEN}\nOrphan content`;
26
+ expect(extractUserCustomZone(content)).toBeNull();
27
+ });
28
+
29
+ it('handles multi-line custom content', () => {
30
+ const content = [
31
+ OPEN,
32
+ 'Rule 1: Do this',
33
+ 'Rule 2: Do that',
34
+ '',
35
+ 'Rule 3: Also this',
36
+ CLOSE,
37
+ ].join('\n');
38
+ const result = extractUserCustomZone(content);
39
+ expect(result).toContain('Rule 1: Do this');
40
+ expect(result).toContain('Rule 3: Also this');
41
+ });
42
+
43
+ it('uses first pair of markers (ignores nested)', () => {
44
+ const content = [OPEN, 'First zone', CLOSE, OPEN, 'Second zone', CLOSE].join('\n');
45
+ const result = extractUserCustomZone(content);
46
+ expect(result).toContain('First zone');
47
+ expect(result).not.toContain('Second zone');
48
+ });
49
+ });
50
+
51
+ describe('injectUserCustomZone', () => {
52
+ it('replaces content between markers', () => {
53
+ const content = ['# Agent', OPEN, 'Old content', CLOSE, '## Footer'].join('\n');
54
+ const newZone = [OPEN, 'New content', CLOSE].join('\n');
55
+ const result = injectUserCustomZone(content, newZone);
56
+ expect(result).toContain('New content');
57
+ expect(result).not.toContain('Old content');
58
+ expect(result).toContain(OPEN);
59
+ expect(result).toContain(CLOSE);
60
+ expect(result).toContain('## Footer');
61
+ });
62
+
63
+ it('returns content unchanged when no markers present', () => {
64
+ const content = '# Agent\nNo markers here.';
65
+ const newZone = [OPEN, 'Injected', CLOSE].join('\n');
66
+ // No existing block to replace — inserts before engine-rules-ref or appends
67
+ const result = injectUserCustomZone(content, newZone);
68
+ expect(result).toContain('Injected');
69
+ });
70
+
71
+ it('round-trips with extractUserCustomZone', () => {
72
+ const original = ['# Agent', OPEN, 'Original rules', CLOSE, '## Footer'].join('\n');
73
+
74
+ // Extract
75
+ const extracted = extractUserCustomZone(original);
76
+ expect(extracted).not.toBeNull();
77
+ expect(extracted).toContain('Original rules');
78
+
79
+ // Regenerate (simulating soleri agent refresh)
80
+ const regenerated = ['# Agent v2', OPEN, 'Placeholder', CLOSE, '## New Footer'].join('\n');
81
+
82
+ // Inject back
83
+ const result = injectUserCustomZone(regenerated, extracted!);
84
+ expect(result).toContain('Original rules');
85
+ expect(result).not.toContain('Placeholder');
86
+ expect(result).toContain('# Agent v2');
87
+ expect(result).toContain('## New Footer');
88
+ });
89
+ });
@@ -158,6 +158,50 @@ describe('scaffoldFileTree', () => {
158
158
  expect(existsSync(join(result.agentDir, 'workflows', 'code-review', 'prompt.md'))).toBe(true);
159
159
  });
160
160
 
161
+ it('scaffolded gates.yaml contains schema comment header', () => {
162
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
163
+ expect(result.success).toBe(true);
164
+
165
+ const gatesContent = readFileSync(
166
+ join(result.agentDir, 'workflows', 'feature-dev', 'gates.yaml'),
167
+ 'utf-8',
168
+ );
169
+ expect(gatesContent).toContain(
170
+ '# Workflow gates — engine reads these and enforces them during plan execution.',
171
+ );
172
+ expect(gatesContent).toContain(
173
+ '# Format: phase (brainstorming|pre-execution|post-task|completion), requirement, check',
174
+ );
175
+
176
+ // Verify all workflow gates have the header
177
+ const bugFixGates = readFileSync(
178
+ join(result.agentDir, 'workflows', 'bug-fix', 'gates.yaml'),
179
+ 'utf-8',
180
+ );
181
+ expect(bugFixGates).toContain('# Workflow gates');
182
+ });
183
+
184
+ it('scaffolded tools.yaml contains schema comment header', () => {
185
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
186
+ expect(result.success).toBe(true);
187
+
188
+ const toolsContent = readFileSync(
189
+ join(result.agentDir, 'workflows', 'feature-dev', 'tools.yaml'),
190
+ 'utf-8',
191
+ );
192
+ expect(toolsContent).toContain('# Workflow tools — engine merges these into plan steps.');
193
+ expect(toolsContent).toContain(
194
+ '# Format: list of operation strings (agentId_facade op:operation_name)',
195
+ );
196
+
197
+ // Verify all workflow tools have the header
198
+ const bugFixTools = readFileSync(
199
+ join(result.agentDir, 'workflows', 'bug-fix', 'tools.yaml'),
200
+ 'utf-8',
201
+ );
202
+ expect(bugFixTools).toContain('# Workflow tools');
203
+ });
204
+
161
205
  it('generates knowledge bundles per domain', () => {
162
206
  const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
163
207
  expect(result.success).toBe(true);
@@ -533,4 +577,53 @@ describe('scaffoldFileTree', () => {
533
577
  expect(claudeMd).not.toContain('## Workspaces');
534
578
  expect(claudeMd).not.toContain('## Task Routing');
535
579
  });
580
+
581
+ // ─── Modular CLAUDE.md Pipeline Tests ─────────────────────────
582
+
583
+ it('CLAUDE.md contains engine-rules-ref marker instead of full engine rules', () => {
584
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
585
+ expect(result.success).toBe(true);
586
+
587
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
588
+ // Should have the reference marker
589
+ expect(claudeMd).toContain('<!-- soleri:engine-rules-ref -->');
590
+ expect(claudeMd).toContain('<!-- /soleri:engine-rules-ref -->');
591
+ // Should NOT have the full engine rules inlined
592
+ expect(claudeMd).not.toContain('<!-- soleri:engine-rules -->');
593
+ expect(claudeMd).not.toContain('<!-- /soleri:engine-rules -->');
594
+ });
595
+
596
+ it('CLAUDE.md engine-rules-ref mentions instructions/_engine.md', () => {
597
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
598
+ expect(result.success).toBe(true);
599
+
600
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
601
+ expect(claudeMd).toContain('instructions/_engine.md');
602
+ });
603
+
604
+ it('_engine.md contains the full engine rules with engine-rules markers', () => {
605
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
606
+ expect(result.success).toBe(true);
607
+
608
+ const engineMd = readFileSync(join(result.agentDir, 'instructions', '_engine.md'), 'utf-8');
609
+ expect(engineMd).toContain('<!-- soleri:engine-rules -->');
610
+ expect(engineMd).toContain('<!-- /soleri:engine-rules -->');
611
+ // Should contain actual engine rules sections
612
+ expect(engineMd).toContain('Vault as Source of Truth');
613
+ expect(engineMd).toContain('Planning');
614
+ expect(engineMd).toContain('Clean Commits');
615
+ expect(engineMd).toContain('Knowledge Capture');
616
+ });
617
+
618
+ it('CLAUDE.md does not duplicate engine rules content from _engine.md', () => {
619
+ const result = scaffoldFileTree(MINIMAL_CONFIG, tempDir);
620
+ expect(result.success).toBe(true);
621
+
622
+ const claudeMd = readFileSync(join(result.agentDir, 'CLAUDE.md'), 'utf-8');
623
+ // Full engine rules sections should NOT appear in CLAUDE.md
624
+ // (they are in _engine.md, referenced by the ref marker)
625
+ expect(claudeMd).not.toContain('## Memory Quality Gate');
626
+ expect(claudeMd).not.toContain('## Vault as Source of Truth');
627
+ expect(claudeMd).not.toContain('## Intent Detection');
628
+ });
536
629
  });
@@ -212,9 +212,11 @@ describe('Scaffolder', () => {
212
212
  expect(setup).toContain('AGENT_NAME="atlas"');
213
213
  expect(setup).toContain('#!/usr/bin/env bash');
214
214
 
215
- const stats = statSync(setupPath);
216
- const isExecutable = (stats.mode & 0o111) !== 0;
217
- expect(isExecutable).toBe(true);
215
+ if (process.platform !== 'win32') {
216
+ const stats = statSync(setupPath);
217
+ const isExecutable = (stats.mode & 0o111) !== 0;
218
+ expect(isExecutable).toBe(true);
219
+ }
218
220
  });
219
221
 
220
222
  it('should generate facade tests using runtime factories', () => {
@@ -297,7 +299,7 @@ describe('Scaffolder', () => {
297
299
 
298
300
  for (const dir of skillDirs) {
299
301
  const content = readFileSync(join(skillsDir, dir, 'SKILL.md'), 'utf-8');
300
- expect(content).toMatch(/^---\nname: /);
302
+ expect(content).toMatch(/^---\r?\nname: /);
301
303
  expect(content).toContain('description:');
302
304
  }
303
305
  });
@@ -326,7 +328,7 @@ describe('Scaffolder', () => {
326
328
  const skillPath = join(skillsDir, name, 'SKILL.md');
327
329
  if (existsSync(skillPath)) {
328
330
  const content = readFileSync(skillPath, 'utf-8');
329
- expect(content).toMatch(/^---\nname: /);
331
+ expect(content).toMatch(/^---\r?\nname: /);
330
332
  }
331
333
  }
332
334
  });
@@ -1,5 +1,11 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { getEngineRulesContent, getEngineMarker } from '../templates/shared-rules.js';
2
+ import {
3
+ getEngineRulesContent,
4
+ getEngineMarker,
5
+ getModularEngineRules,
6
+ ENGINE_FEATURES,
7
+ } from '../templates/shared-rules.js';
8
+ import type { EngineFeature } from '../templates/shared-rules.js';
3
9
 
4
10
  describe('shared-rules', () => {
5
11
  const content = getEngineRulesContent();
@@ -45,4 +51,96 @@ describe('shared-rules', () => {
45
51
  it('describes orchestrate_complete as user-gated in the Non-Negotiable Rule', () => {
46
52
  expect(content).toContain('user-gated');
47
53
  });
54
+
55
+ describe('getModularEngineRules', () => {
56
+ it('returns full content when no features specified', () => {
57
+ const modular = getModularEngineRules();
58
+ expect(modular).toBe(content);
59
+ });
60
+
61
+ it('returns full content when empty features array', () => {
62
+ const modular = getModularEngineRules([]);
63
+ expect(modular).toBe(content);
64
+ });
65
+
66
+ it('always includes core sections regardless of features', () => {
67
+ const modular = getModularEngineRules(['vault']);
68
+ expect(modular).toContain('## What is Soleri');
69
+ expect(modular).toContain('## Response Integrity');
70
+ expect(modular).toContain('## Output Formatting');
71
+ expect(modular).toContain('## Clean Commits');
72
+ expect(modular).toContain('## Session Lifecycle');
73
+ });
74
+
75
+ it('includes vault sections when vault feature is specified', () => {
76
+ const modular = getModularEngineRules(['vault']);
77
+ expect(modular).toContain('## Vault as Source of Truth');
78
+ expect(modular).toContain('## Knowledge Capture');
79
+ });
80
+
81
+ it('excludes planning sections when only vault feature is specified', () => {
82
+ const modular = getModularEngineRules(['vault']);
83
+ expect(modular).not.toContain('## Planning');
84
+ expect(modular).not.toContain('## YOLO Mode');
85
+ expect(modular).not.toContain('## Verification Protocol');
86
+ });
87
+
88
+ it('includes planning sections when planning feature is specified', () => {
89
+ const modular = getModularEngineRules(['planning']);
90
+ expect(modular).toContain('## Planning');
91
+ expect(modular).toContain('## Workflow Overrides');
92
+ expect(modular).toContain('## YOLO Mode');
93
+ });
94
+
95
+ it('excludes brain sections when only planning feature is specified', () => {
96
+ const modular = getModularEngineRules(['planning']);
97
+ expect(modular).not.toContain('## Brain-Informed Work');
98
+ expect(modular).not.toContain('## Model Routing Guidance');
99
+ });
100
+
101
+ it('includes brain sections when brain feature is specified', () => {
102
+ const modular = getModularEngineRules(['brain']);
103
+ expect(modular).toContain('## Brain-Informed Work');
104
+ });
105
+
106
+ it('includes advanced sections when advanced feature is specified', () => {
107
+ const modular = getModularEngineRules(['advanced']);
108
+ expect(modular).toContain('## Subagent Identity');
109
+ });
110
+
111
+ it('excludes advanced sections when not specified', () => {
112
+ const modular = getModularEngineRules(['vault', 'planning']);
113
+ expect(modular).not.toContain('## Subagent Identity');
114
+ });
115
+
116
+ it('combines multiple features correctly', () => {
117
+ const modular = getModularEngineRules(['vault', 'brain']);
118
+ expect(modular).toContain('## Vault as Source of Truth');
119
+ expect(modular).toContain('## Brain-Informed Work');
120
+ expect(modular).not.toContain('## Planning');
121
+ expect(modular).not.toContain('## Subagent Identity');
122
+ });
123
+
124
+ it('includes engine-rules markers', () => {
125
+ const modular = getModularEngineRules(['vault']);
126
+ expect(modular).toContain(`<!-- ${getEngineMarker()} -->`);
127
+ expect(modular).toContain(`<!-- /${getEngineMarker()} -->`);
128
+ });
129
+
130
+ it('all features returns same content as full rules', () => {
131
+ const allFeatures = getModularEngineRules([...ENGINE_FEATURES] as EngineFeature[]);
132
+ // Should contain all sections
133
+ expect(allFeatures).toContain('## Vault as Source of Truth');
134
+ expect(allFeatures).toContain('## Planning');
135
+ expect(allFeatures).toContain('## Brain-Informed Work');
136
+ expect(allFeatures).toContain('## Subagent Identity');
137
+ });
138
+
139
+ it('is significantly smaller when only one feature is selected', () => {
140
+ const full = getEngineRulesContent();
141
+ const vaultOnly = getModularEngineRules(['vault']);
142
+ // Vault-only should be meaningfully smaller than full rules
143
+ expect(vaultOnly.length).toBeLessThan(full.length * 0.8);
144
+ });
145
+ });
48
146
  });
@@ -9,6 +9,7 @@
9
9
  */
10
10
 
11
11
  import { z } from 'zod';
12
+ import { ENGINE_FEATURES } from './templates/shared-rules.js';
12
13
 
13
14
  // ─── Constants ────────────────────────────────────────────────────────
14
15
 
@@ -63,6 +64,13 @@ const EngineConfigSchema = z.object({
63
64
  learning: z.boolean().optional().default(true),
64
65
  /** Session compaction policy — thresholds for automatic session rotation */
65
66
  compactionPolicy: CompactionPolicySchema.optional(),
67
+ /**
68
+ * Engine rule modules to include in CLAUDE.md.
69
+ * Core rules are always included. Feature modules are additive.
70
+ * Omit or leave empty to include ALL modules (backward compatible).
71
+ * Example: ['vault', 'planning'] includes core + vault + planning rules.
72
+ */
73
+ features: z.array(z.enum(ENGINE_FEATURES as unknown as [string, ...string[]])).optional(),
66
74
  });
67
75
 
68
76
  /** Client setup configuration */
@@ -11,6 +11,57 @@ import { parse as parseYaml } from 'yaml';
11
11
  import { AgentYamlSchema, type AgentYaml } from './agent-schema.js';
12
12
  import { ENGINE_MODULE_MANIFEST, CORE_KEY_OPS } from '@soleri/core/module-manifest';
13
13
 
14
+ // ─── User Custom Zone ────────────────────────────────────────────────
15
+
16
+ const USER_CUSTOM_OPEN = '<!-- user:custom -->';
17
+ const USER_CUSTOM_CLOSE = '<!-- /user:custom -->';
18
+
19
+ const DEFAULT_USER_CUSTOM_BLOCK = [
20
+ USER_CUSTOM_OPEN,
21
+ '<!-- Add your custom instructions here. This section survives regeneration. -->',
22
+ USER_CUSTOM_CLOSE,
23
+ ].join('\n');
24
+
25
+ /**
26
+ * Extract content between `<!-- user:custom -->` and `<!-- /user:custom -->` markers.
27
+ * Returns the full block (including markers) or null if not found.
28
+ */
29
+ export function extractUserCustomZone(content: string): string | null {
30
+ const openIdx = content.indexOf(USER_CUSTOM_OPEN);
31
+ if (openIdx === -1) return null;
32
+
33
+ const closeIdx = content.indexOf(USER_CUSTOM_CLOSE, openIdx);
34
+ if (closeIdx === -1) return null;
35
+
36
+ return content.slice(openIdx, closeIdx + USER_CUSTOM_CLOSE.length);
37
+ }
38
+
39
+ /**
40
+ * Inject a user:custom zone into composed CLAUDE.md content.
41
+ * Replaces the existing user:custom block if present, otherwise inserts
42
+ * before the engine-rules-ref marker (or appends at the end).
43
+ */
44
+ export function injectUserCustomZone(content: string, userZone: string): string {
45
+ // If the content already has a user:custom block, replace it
46
+ const existing = extractUserCustomZone(content);
47
+ if (existing) {
48
+ return content.replace(existing, userZone);
49
+ }
50
+
51
+ // Insert before engine-rules-ref if present
52
+ const engineRefMarker = '<!-- soleri:engine-rules-ref -->';
53
+ const engineIdx = content.indexOf(engineRefMarker);
54
+ if (engineIdx !== -1) {
55
+ return content.slice(0, engineIdx) + userZone + '\n\n' + content.slice(engineIdx);
56
+ }
57
+
58
+ // Fallback: append before the last newline
59
+ if (content.endsWith('\n')) {
60
+ return content.slice(0, -1) + '\n\n' + userZone + '\n';
61
+ }
62
+ return content + '\n\n' + userZone + '\n';
63
+ }
64
+
14
65
  // ─── Types ────────────────────────────────────────────────────────────
15
66
 
16
67
  export interface ComposedClaudeMd {
@@ -37,6 +88,15 @@ export interface ToolEntry {
37
88
  export function composeClaudeMd(agentDir: string, tools?: ToolEntry[]): ComposedClaudeMd {
38
89
  const sources: string[] = [];
39
90
 
91
+ // 0. Read existing CLAUDE.md to preserve user:custom zone
92
+ const existingClaudeMdPath = join(agentDir, 'CLAUDE.md');
93
+ let preservedUserZone: string | null = null;
94
+ let existingContent: string | null = null;
95
+ if (existsSync(existingClaudeMdPath)) {
96
+ existingContent = readFileSync(existingClaudeMdPath, 'utf-8');
97
+ preservedUserZone = extractUserCustomZone(existingContent);
98
+ }
99
+
40
100
  // 1. Read agent.yaml
41
101
  const agentYamlPath = join(agentDir, 'agent.yaml');
42
102
  const agentYaml = AgentYamlSchema.parse(parseYaml(readFileSync(agentYamlPath, 'utf-8')));
@@ -128,10 +188,74 @@ export function composeClaudeMd(agentDir: string, tools?: ToolEntry[]): Composed
128
188
  if (skillsSection) sections.push(skillsSection);
129
189
  }
130
190
 
191
+ // 10. Inject user:custom zone (preserved from old file, or default empty block)
192
+ const userZone = preservedUserZone ?? DEFAULT_USER_CUSTOM_BLOCK;
193
+ sections.splice(findUserCustomInsertIndex(sections), 0, userZone);
194
+
131
195
  const content = sections.join('\n\n') + '\n';
196
+
197
+ // 11. Detect orphaned content in old file (compare against newly composed content)
198
+ if (existingContent) {
199
+ detectOrphanedContent(existingContent, content);
200
+ }
201
+
132
202
  return { content, sources };
133
203
  }
134
204
 
205
+ // ─── User Custom Zone Helpers ────────────────────────────────────────
206
+
207
+ /**
208
+ * Find the insertion index for the user:custom zone in the sections array.
209
+ * Target: after user instructions (instructions/user.md content), before engine-rules-ref.
210
+ */
211
+ function findUserCustomInsertIndex(sections: string[]): number {
212
+ // Look for the engine-rules-ref marker
213
+ const engineRefIdx = sections.findIndex((s) => s.includes('<!-- soleri:engine-rules-ref -->'));
214
+ if (engineRefIdx !== -1) return engineRefIdx;
215
+
216
+ // Fallback: insert before the last section
217
+ return sections.length;
218
+ }
219
+
220
+ /**
221
+ * Detect content in existing CLAUDE.md that was manually added outside of
222
+ * the user:custom zone. Compares the old file's headings against a freshly
223
+ * composed version — any heading in the old file that doesn't appear in
224
+ * the new composition (and isn't inside user:custom) is orphaned.
225
+ *
226
+ * @param existingContent - The current CLAUDE.md content before regeneration
227
+ * @param newContent - The freshly composed CLAUDE.md content
228
+ */
229
+ function detectOrphanedContent(existingContent: string, newContent: string): void {
230
+ // Extract headings from old file (excluding those inside user:custom zone)
231
+ const oldHeadings = extractHeadingsOutsideUserCustom(existingContent);
232
+ if (oldHeadings.length === 0) return;
233
+
234
+ // Extract headings from new composed content
235
+ const newHeadingSet = new Set(newContent.match(/^#{1,3} .+$/gm)?.map((h) => h.trim()) ?? []);
236
+
237
+ // Find headings in old that don't exist in new
238
+ const orphaned = oldHeadings.filter((h) => !newHeadingSet.has(h));
239
+
240
+ if (orphaned.length > 0) {
241
+ process.stderr.write(
242
+ '\u26a0 CLAUDE.md contains content outside managed sections. ' +
243
+ 'Move to instructions/ or <!-- user:custom --> to preserve across regeneration.\n',
244
+ );
245
+ }
246
+ }
247
+
248
+ /**
249
+ * Extract markdown headings from content, excluding any inside the user:custom zone.
250
+ */
251
+ function extractHeadingsOutsideUserCustom(content: string): string[] {
252
+ // Remove user:custom zone content first
253
+ const userZone = extractUserCustomZone(content);
254
+ const cleaned = userZone ? content.replace(userZone, '') : content;
255
+
256
+ return cleaned.match(/^#{1,3} .+$/gm)?.map((h) => h.trim()) ?? [];
257
+ }
258
+
135
259
  // ─── Section Composers ────────────────────────────────────────────────
136
260
 
137
261
  function composeIdentityBlock(agent: AgentYaml): string {
package/src/lib.ts CHANGED
@@ -34,7 +34,13 @@ export { composeClaudeMd } from './compose-claude-md.js';
34
34
  export type { ComposedClaudeMd, ToolEntry } from './compose-claude-md.js';
35
35
  export { generateExtensionsIndex, generateExampleOp } from './templates/extensions.js';
36
36
  export { generateClaudeMdTemplate } from './templates/claude-md-template.js';
37
- export { getEngineRulesContent, getEngineMarker } from './templates/shared-rules.js';
37
+ export {
38
+ getEngineRulesContent,
39
+ getEngineMarker,
40
+ getModularEngineRules,
41
+ ENGINE_FEATURES,
42
+ } from './templates/shared-rules.js';
43
+ export type { EngineFeature } from './templates/shared-rules.js';
38
44
  export { generateInjectClaudeMd } from './templates/inject-claude-md.js';
39
45
  export { generateSkills } from './templates/skills.js';
40
46
  export { generateTelegramBot } from './templates/telegram-bot.js';