@soleri/forge 9.9.0 → 9.11.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.
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Section parser for marker-delimited engine rules content.
3
+ *
4
+ * Extracts `<!-- soleri:xxx -->` sections from the engine rules markdown,
5
+ * enabling selective inclusion of feature modules.
6
+ *
7
+ * Single-pass: splits on `## ` headings, maps chunks to markers, filters.
8
+ */
9
+ const SECTION_MARKER_RE = /<!-- (soleri:[a-z-]+) -->/;
10
+ const CLOSING_MARKER = '<!-- /soleri:engine-rules -->';
11
+ /**
12
+ * Parse marker-delimited sections from engine rules content.
13
+ *
14
+ * Strategy: split on `## ` heading boundaries, then classify each chunk
15
+ * as preamble, section (has a marker), or closing (has closing marker).
16
+ */
17
+ export function parseSections(content) {
18
+ // Split at each `## ` heading — lookahead preserves the heading in the chunk
19
+ const chunks = content.split(/(?=^## )/m);
20
+ let preamble = '';
21
+ const sections = [];
22
+ let closing = '';
23
+ let foundFirstSection = false;
24
+ for (const chunk of chunks) {
25
+ // Check if this chunk contains the closing marker
26
+ const closingIdx = chunk.indexOf(CLOSING_MARKER);
27
+ if (closingIdx !== -1) {
28
+ // Content before closing marker belongs to last section or preamble
29
+ const beforeClosing = chunk.slice(0, closingIdx);
30
+ const afterClosing = chunk.slice(closingIdx);
31
+ if (beforeClosing.trim()) {
32
+ const markerMatch = beforeClosing.match(SECTION_MARKER_RE);
33
+ if (markerMatch && markerMatch[1] !== 'soleri:engine-rules') {
34
+ sections.push({ marker: markerMatch[1], content: beforeClosing });
35
+ foundFirstSection = true;
36
+ }
37
+ else if (!foundFirstSection) {
38
+ preamble += beforeClosing;
39
+ }
40
+ }
41
+ closing = afterClosing;
42
+ continue;
43
+ }
44
+ // Check if chunk has a section marker
45
+ const markerMatch = chunk.match(SECTION_MARKER_RE);
46
+ if (markerMatch && markerMatch[1] !== 'soleri:engine-rules') {
47
+ sections.push({ marker: markerMatch[1], content: chunk });
48
+ foundFirstSection = true;
49
+ }
50
+ else {
51
+ // No marker — this is preamble (before first section)
52
+ if (!foundFirstSection) {
53
+ preamble += chunk;
54
+ }
55
+ }
56
+ }
57
+ return { preamble, sections, closing };
58
+ }
59
+ /**
60
+ * Rebuild content from parsed sections, including only allowed markers.
61
+ */
62
+ export function filterSections(parsed, allowedMarkers) {
63
+ const parts = [parsed.preamble];
64
+ for (const section of parsed.sections) {
65
+ if (allowedMarkers.has(section.marker)) {
66
+ let text = section.content;
67
+ if (!text.endsWith('\n'))
68
+ text += '\n';
69
+ parts.push(text);
70
+ }
71
+ }
72
+ parts.push(parsed.closing);
73
+ return parts.join('\n');
74
+ }
75
+ //# sourceMappingURL=section-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-parser.js","sourceRoot":"","sources":["../../src/templates/section-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAkBH,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;AACtD,MAAM,cAAc,GAAG,+BAA+B,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,6EAA6E;IAC7E,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE1C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,iBAAiB,GAAG,KAAK,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,kDAAkD;QAClD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,oEAAoE;YACpE,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAE7C,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzB,MAAM,WAAW,GAAG,aAAa,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC3D,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;oBAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;oBAClE,iBAAiB,GAAG,IAAI,CAAC;gBAC3B,CAAC;qBAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC9B,QAAQ,IAAI,aAAa,CAAC;gBAC5B,CAAC;YACH,CAAC;YACD,OAAO,GAAG,YAAY,CAAC;YACvB,SAAS;QACX,CAAC;QAED,sCAAsC;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACnD,IAAI,WAAW,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,qBAAqB,EAAE,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1D,iBAAiB,GAAG,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,QAAQ,IAAI,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB,EAAE,cAA2B;IAC/E,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE1C,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,IAAI,IAAI,IAAI,CAAC;YACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -11,3 +11,17 @@
11
11
  export declare function getEngineMarker(): string;
12
12
  /** Returns the full engine rules markdown content (with markers). */
13
13
  export declare function getEngineRulesContent(): string;
14
+ /** Feature modules that can be selectively included in engine rules. */
15
+ export type EngineFeature = 'vault' | 'planning' | 'brain' | 'advanced';
16
+ /** All available feature modules. */
17
+ export declare const ENGINE_FEATURES: readonly EngineFeature[];
18
+ /**
19
+ * Returns engine rules with only selected feature modules included.
20
+ *
21
+ * Core rules are ALWAYS included. Feature modules are included when:
22
+ * - `features` is undefined/empty → ALL modules included (backward compatible)
23
+ * - `features` is specified → only listed modules + core
24
+ *
25
+ * @param features - Feature modules to include. Omit for all.
26
+ */
27
+ export declare function getModularEngineRules(features?: EngineFeature[]): string;
@@ -8,6 +8,7 @@
8
8
  *
9
9
  * Uses op:name syntax — the active agent provides the tool prefix.
10
10
  */
11
+ import { parseSections, filterSections } from './section-parser.js';
11
12
  const ENGINE_MARKER = 'soleri:engine-rules';
12
13
  export function getEngineMarker() {
13
14
  return ENGINE_MARKER;
@@ -16,6 +17,75 @@ export function getEngineMarker() {
16
17
  export function getEngineRulesContent() {
17
18
  return ENGINE_RULES_LINES.join('\n');
18
19
  }
20
+ /** All available feature modules. */
21
+ export const ENGINE_FEATURES = [
22
+ 'vault',
23
+ 'planning',
24
+ 'brain',
25
+ 'advanced',
26
+ ];
27
+ /**
28
+ * Section markers grouped by module.
29
+ *
30
+ * 'core' sections are always included.
31
+ * Feature modules are included only when requested (or when no filter is specified).
32
+ */
33
+ const MODULE_SECTIONS = {
34
+ core: [
35
+ 'soleri:what-is-soleri',
36
+ 'soleri:response-integrity',
37
+ 'soleri:tool-schema-validation',
38
+ 'soleri:memory-quality',
39
+ 'soleri:output-formatting',
40
+ 'soleri:clean-commits',
41
+ 'soleri:intent-detection',
42
+ 'soleri:overlay-mode',
43
+ 'soleri:session',
44
+ 'soleri:getting-started',
45
+ 'soleri:cli',
46
+ 'soleri:persona-self-update',
47
+ 'soleri:workspace-routing',
48
+ ],
49
+ vault: [
50
+ 'soleri:vault-protocol',
51
+ 'soleri:knowledge-capture',
52
+ 'soleri:tool-advocacy',
53
+ 'soleri:cross-project',
54
+ ],
55
+ planning: [
56
+ 'soleri:planning',
57
+ 'soleri:workflow-overrides',
58
+ 'soleri:yolo-mode',
59
+ 'soleri:task-routing',
60
+ 'soleri:validation-loop',
61
+ 'soleri:verification-protocol',
62
+ ],
63
+ brain: ['soleri:brain', 'soleri:model-routing'],
64
+ advanced: ['soleri:subagent-identity'],
65
+ };
66
+ /**
67
+ * Returns engine rules with only selected feature modules included.
68
+ *
69
+ * Core rules are ALWAYS included. Feature modules are included when:
70
+ * - `features` is undefined/empty → ALL modules included (backward compatible)
71
+ * - `features` is specified → only listed modules + core
72
+ *
73
+ * @param features - Feature modules to include. Omit for all.
74
+ */
75
+ export function getModularEngineRules(features) {
76
+ if (!features || features.length === 0) {
77
+ return getEngineRulesContent();
78
+ }
79
+ const allowedMarkers = new Set(MODULE_SECTIONS.core);
80
+ for (const feature of features) {
81
+ const sections = MODULE_SECTIONS[feature];
82
+ if (sections)
83
+ for (const m of sections)
84
+ allowedMarkers.add(m);
85
+ }
86
+ const parsed = parseSections(getEngineRulesContent());
87
+ return filterSections(parsed, allowedMarkers);
88
+ }
19
89
  const ENGINE_RULES_LINES = [
20
90
  `<!-- ${ENGINE_MARKER} -->`,
21
91
  '',
@@ -367,6 +437,8 @@ const ENGINE_RULES_LINES = [
367
437
  '- Knowledge to vault (patterns learned, decisions made)',
368
438
  '- Session summary (what was done, files changed)',
369
439
  "- Brain feedback (what worked, what didn't)",
440
+ '- Evidence report — git diff vs plan tasks (accuracy score, verdicts per task)',
441
+ '- Fix-trail quality signals — clean first-try tasks strengthen brain patterns, high-rework tasks (2+ fix iterations) flag anti-patterns',
370
442
  '',
371
443
  'Without completion, the knowledge trail is lost. The code is in git, but the WHY disappears.',
372
444
  '',
@@ -634,6 +706,7 @@ const ENGINE_RULES_LINES = [
634
706
  '|----------------|---------|',
635
707
  '| Engine + CLI | `npx @soleri/cli@latest upgrade` or `soleri upgrade` |',
636
708
  '| Agent templates | `soleri agent refresh` (regenerates CLAUDE.md from latest engine) |',
709
+ '| Any agent by path | `soleri agent refresh --path ~/projects/my-agent` (from any directory) |',
637
710
  '| Knowledge packs | `soleri pack update` |',
638
711
  '| Check for updates | `soleri agent status` or `soleri agent update --check` |',
639
712
  '',
@@ -658,28 +731,28 @@ const ENGINE_RULES_LINES = [
658
731
  '',
659
732
  '### How Your CLAUDE.md is Built',
660
733
  '',
661
- 'Your CLAUDE.md is **auto-generated** — never edit it manually. It gets regenerated by `composeClaudeMd()` in these scenarios:',
662
- '',
663
- '| Trigger | How |',
664
- '|---------|-----|',
665
- '| `soleri dev` | Hot-reloads and regenerates on file changes |',
666
- '| `soleri agent refresh` | Explicitly regenerates from latest templates |',
667
- '| `soleri agent update` | After engine update, regenerates to pick up new rules |',
668
- '| Scaffold (`create-soleri`) | Generates initial CLAUDE.md for new agents |',
734
+ 'Your CLAUDE.md is **auto-generated** — never edit it manually (except inside `<!-- user:custom -->` markers). Regenerated by `soleri dev`, `soleri agent refresh`, `soleri agent update`, and on scaffold.',
669
735
  '',
670
736
  'The composition pipeline assembles CLAUDE.md from:',
671
737
  '',
672
738
  '1. **Agent identity** — from `agent.yaml`',
673
739
  '2. **Custom instructions** — from `instructions/user.md` (priority placement, before engine rules)',
674
- '3. **Engine rules** — from `@soleri/forge` shared rules (this section)',
740
+ '3. **Engine rules** — modular, controlled by `engine.features` in `agent.yaml`',
675
741
  '4. **User instructions** — from `instructions/*.md` (alphabetically sorted, excluding `user.md` and `_engine.md`)',
676
742
  '5. **Tools table** — from engine registration',
677
743
  '6. **Workflow index** — from `workflows/`',
678
744
  '7. **Skills index** — from `skills/`',
679
745
  '',
680
- '`instructions/user.md` is the recommended place for your most important agent-specific rules it appears early in CLAUDE.md for maximum influence on model behavior. Other `instructions/*.md` files are included after engine rules.',
746
+ '**Modular engine rules:** The `engine.features` array in `agent.yaml` controls which rule modules are included. Available: `vault`, `planning`, `brain`, `advanced`. Core rules are always included. Default (no features specified) = all modules.',
747
+ '',
748
+ '### What Survives Regeneration',
681
749
  '',
682
- 'When the engine updates (`@soleri/core` or `@soleri/forge`), running `soleri agent refresh` regenerates CLAUDE.md with the latest shared rules. Your own `instructions/*.md` files are where agent-specific behavior lives — those survive regeneration.',
750
+ '| Source | Survives? |',
751
+ '|--------|-----------|',
752
+ '| `instructions/*.md` | Yes — re-read on every regen |',
753
+ '| `<!-- user:custom -->` zone in CLAUDE.md | Yes — extracted and re-injected |',
754
+ '| `agent.yaml` | Drives regen (source of truth) |',
755
+ '| Manual CLAUDE.md edits outside markers | No — overwritten, warning logged |',
683
756
  '',
684
757
  '### System Requirements',
685
758
  '',
@@ -697,10 +770,10 @@ const ENGINE_RULES_LINES = [
697
770
  '',
698
771
  '| Command | What it does |',
699
772
  '|---------|-------------|',
700
- '| `soleri agent status` | Health check — version, packs, vault, update availability |',
701
- '| `soleri agent update` | Update engine to latest compatible version (`--check` for dry run) |',
702
- '| `soleri agent refresh` | Regenerate AGENTS.md/CLAUDE.md from latest forge templates (`--dry-run` to preview) |',
703
- '| `soleri agent diff` | Show drift between current templates and latest engine |',
773
+ '| `soleri agent status` | Health check — version, packs, vault, update availability (`--path <dir>`) |',
774
+ '| `soleri agent update` | Update engine to latest compatible version (`--check`, `--path <dir>`) |',
775
+ '| `soleri agent refresh` | Regenerate AGENTS.md/CLAUDE.md from latest forge templates (`--dry-run`, `--path <dir>`) |',
776
+ '| `soleri agent diff` | Show drift between current templates and latest engine (`--path <dir>`) |',
704
777
  '| `soleri doctor` | Full system health and project status check |',
705
778
  '| `soleri dev` | Run agent in development mode (stdio MCP) |',
706
779
  '| `soleri test` | Run agent tests (`--watch`, `--coverage`) |',
@@ -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.9.0",
3
+ "version": "9.11.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
+ });
@@ -577,4 +577,53 @@ describe('scaffoldFileTree', () => {
577
577
  expect(claudeMd).not.toContain('## Workspaces');
578
578
  expect(claudeMd).not.toContain('## Task Routing');
579
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
+ });
580
629
  });
@@ -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 */