@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.
- package/dist/agent-schema.d.ts +11 -0
- package/dist/agent-schema.js +8 -0
- package/dist/agent-schema.js.map +1 -1
- package/dist/compose-claude-md.d.ts +11 -0
- package/dist/compose-claude-md.js +104 -0
- package/dist/compose-claude-md.js.map +1 -1
- package/dist/lib.d.ts +2 -1
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/scaffold-filetree.js +28 -11
- package/dist/scaffold-filetree.js.map +1 -1
- package/dist/skills/subagent-driven-development/SKILL.md +87 -20
- package/dist/templates/inject-claude-md.js +50 -5
- package/dist/templates/inject-claude-md.js.map +1 -1
- package/dist/templates/section-parser.d.ts +33 -0
- package/dist/templates/section-parser.js +75 -0
- package/dist/templates/section-parser.js.map +1 -0
- package/dist/templates/shared-rules.d.ts +14 -0
- package/dist/templates/shared-rules.js +192 -11
- package/dist/templates/shared-rules.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/compose-claude-md.test.ts +89 -0
- package/src/__tests__/scaffold-filetree.test.ts +93 -0
- package/src/__tests__/scaffolder.test.ts +7 -5
- package/src/__tests__/shared-rules.test.ts +99 -1
- package/src/agent-schema.ts +8 -0
- package/src/compose-claude-md.ts +124 -0
- package/src/lib.ts +7 -1
- package/src/scaffold-filetree.ts +34 -11
- package/src/skills/subagent-driven-development/SKILL.md +87 -20
- package/src/templates/inject-claude-md.ts +50 -5
- package/src/templates/section-parser.ts +97 -0
- package/src/templates/shared-rules.ts +203 -11
|
@@ -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
|
@@ -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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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 {
|
|
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
|
});
|
package/src/agent-schema.ts
CHANGED
|
@@ -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 */
|
package/src/compose-claude-md.ts
CHANGED
|
@@ -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 {
|
|
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';
|