@soleri/forge 5.14.0 → 5.14.1
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/index.js +0 -0
- package/dist/lib.d.ts +1 -0
- package/dist/lib.js +1 -0
- package/dist/lib.js.map +1 -1
- package/dist/skills/brain-debrief.md +47 -19
- package/dist/skills/brainstorming.md +19 -9
- package/dist/skills/code-patrol.md +21 -19
- package/dist/skills/context-resume.md +14 -11
- package/dist/skills/executing-plans.md +30 -15
- package/dist/skills/fix-and-learn.md +17 -14
- package/dist/skills/health-check.md +29 -23
- package/dist/skills/knowledge-harvest.md +27 -20
- package/dist/skills/onboard-me.md +16 -15
- package/dist/skills/retrospective.md +34 -18
- package/dist/skills/second-opinion.md +16 -9
- package/dist/skills/systematic-debugging.md +40 -29
- package/dist/skills/test-driven-development.md +45 -30
- package/dist/skills/vault-capture.md +31 -15
- package/dist/skills/vault-navigator.md +24 -13
- package/dist/skills/verification-before-completion.md +38 -26
- package/dist/skills/writing-plans.md +21 -13
- package/dist/templates/claude-md-template.d.ts +9 -8
- package/dist/templates/claude-md-template.js +29 -11
- package/dist/templates/claude-md-template.js.map +1 -1
- package/dist/templates/inject-claude-md.js +65 -25
- package/dist/templates/inject-claude-md.js.map +1 -1
- package/dist/templates/shared-rules.d.ts +10 -6
- package/dist/templates/shared-rules.js +242 -199
- package/dist/templates/shared-rules.js.map +1 -1
- package/package.json +1 -1
- package/src/lib.ts +1 -0
- package/src/templates/claude-md-template.ts +30 -12
- package/src/templates/inject-claude-md.ts +65 -25
- package/src/templates/shared-rules.ts +259 -210
- package/dist/skills/skills/brain-debrief.md +0 -214
- package/dist/skills/skills/brainstorming.md +0 -180
- package/dist/skills/skills/code-patrol.md +0 -178
- package/dist/skills/skills/context-resume.md +0 -146
- package/dist/skills/skills/executing-plans.md +0 -216
- package/dist/skills/skills/fix-and-learn.md +0 -167
- package/dist/skills/skills/health-check.md +0 -231
- package/dist/skills/skills/knowledge-harvest.md +0 -185
- package/dist/skills/skills/onboard-me.md +0 -198
- package/dist/skills/skills/retrospective.md +0 -205
- package/dist/skills/skills/second-opinion.md +0 -149
- package/dist/skills/skills/systematic-debugging.md +0 -241
- package/dist/skills/skills/test-driven-development.md +0 -281
- package/dist/skills/skills/vault-capture.md +0 -170
- package/dist/skills/skills/vault-navigator.md +0 -140
- package/dist/skills/skills/verification-before-completion.md +0 -182
- package/dist/skills/skills/writing-plans.md +0 -215
- package/dist/templates/brain.d.ts +0 -6
- package/dist/templates/brain.js +0 -478
- package/dist/templates/brain.js.map +0 -1
- package/dist/templates/core-facade.d.ts +0 -6
- package/dist/templates/core-facade.js +0 -564
- package/dist/templates/core-facade.js.map +0 -1
- package/dist/templates/facade-factory.d.ts +0 -1
- package/dist/templates/facade-factory.js +0 -63
- package/dist/templates/facade-factory.js.map +0 -1
- package/dist/templates/facade-types.d.ts +0 -1
- package/dist/templates/facade-types.js +0 -46
- package/dist/templates/facade-types.js.map +0 -1
- package/dist/templates/intelligence-loader.d.ts +0 -1
- package/dist/templates/intelligence-loader.js +0 -43
- package/dist/templates/intelligence-loader.js.map +0 -1
- package/dist/templates/intelligence-types.d.ts +0 -1
- package/dist/templates/intelligence-types.js +0 -24
- package/dist/templates/intelligence-types.js.map +0 -1
- package/dist/templates/llm-client.d.ts +0 -7
- package/dist/templates/llm-client.js +0 -300
- package/dist/templates/llm-client.js.map +0 -1
- package/dist/templates/llm-key-pool.d.ts +0 -7
- package/dist/templates/llm-key-pool.js +0 -211
- package/dist/templates/llm-key-pool.js.map +0 -1
- package/dist/templates/llm-types.d.ts +0 -5
- package/dist/templates/llm-types.js +0 -161
- package/dist/templates/llm-types.js.map +0 -1
- package/dist/templates/llm-utils.d.ts +0 -5
- package/dist/templates/llm-utils.js +0 -260
- package/dist/templates/llm-utils.js.map +0 -1
- package/dist/templates/planner.d.ts +0 -5
- package/dist/templates/planner.js +0 -150
- package/dist/templates/planner.js.map +0 -1
- package/dist/templates/test-brain.d.ts +0 -6
- package/dist/templates/test-brain.js +0 -474
- package/dist/templates/test-brain.js.map +0 -1
- package/dist/templates/test-llm.d.ts +0 -7
- package/dist/templates/test-llm.js +0 -574
- package/dist/templates/test-llm.js.map +0 -1
- package/dist/templates/test-loader.d.ts +0 -5
- package/dist/templates/test-loader.js +0 -146
- package/dist/templates/test-loader.js.map +0 -1
- package/dist/templates/test-planner.d.ts +0 -5
- package/dist/templates/test-planner.js +0 -271
- package/dist/templates/test-planner.js.map +0 -1
- package/dist/templates/test-vault.d.ts +0 -5
- package/dist/templates/test-vault.js +0 -380
- package/dist/templates/test-vault.js.map +0 -1
- package/dist/templates/vault.d.ts +0 -5
- package/dist/templates/vault.js +0 -263
- package/dist/templates/vault.js.map +0 -1
|
@@ -2,14 +2,15 @@ import type { AgentConfig } from '../types.js';
|
|
|
2
2
|
/**
|
|
3
3
|
* Generates src/activation/claude-md-content.ts for a new agent.
|
|
4
4
|
*
|
|
5
|
-
* Architecture:
|
|
6
|
-
* 1.
|
|
7
|
-
* 2.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Architecture (split injection):
|
|
6
|
+
* 1. Engine rules — shared, prefix-free, injected once under `<!-- soleri:engine-rules -->`
|
|
7
|
+
* 2. Agent block — lightweight, agent-specific, under `<!-- agent-id:mode -->`
|
|
8
|
+
* - Identity (persona, domains, principles)
|
|
9
|
+
* - Session start protocol
|
|
10
|
+
* - Curated facade table (~30 key ops, grouped by category)
|
|
11
|
+
* - Hook packs (conditional)
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
13
|
+
* The facade table maps `op:name` → actual `agentId_core op:name` tool calls.
|
|
14
|
+
* Full op list is always available via `admin_tool_list`.
|
|
14
15
|
*/
|
|
15
16
|
export declare function generateClaudeMdTemplate(config: AgentConfig): string;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { getEngineMarker, getEngineRulesContent } from './shared-rules.js';
|
|
2
2
|
/**
|
|
3
3
|
* Generates src/activation/claude-md-content.ts for a new agent.
|
|
4
4
|
*
|
|
5
|
-
* Architecture:
|
|
6
|
-
* 1.
|
|
7
|
-
* 2.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Architecture (split injection):
|
|
6
|
+
* 1. Engine rules — shared, prefix-free, injected once under `<!-- soleri:engine-rules -->`
|
|
7
|
+
* 2. Agent block — lightweight, agent-specific, under `<!-- agent-id:mode -->`
|
|
8
|
+
* - Identity (persona, domains, principles)
|
|
9
|
+
* - Session start protocol
|
|
10
|
+
* - Curated facade table (~30 key ops, grouped by category)
|
|
11
|
+
* - Hook packs (conditional)
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
13
|
+
* The facade table maps `op:name` → actual `agentId_core op:name` tool calls.
|
|
14
|
+
* Full op list is always available via `admin_tool_list`.
|
|
14
15
|
*/
|
|
15
16
|
export function generateClaudeMdTemplate(config) {
|
|
16
17
|
const toolPrefix = config.id;
|
|
@@ -57,8 +58,6 @@ export function generateClaudeMdTemplate(config) {
|
|
|
57
58
|
// Engine facades — compact, grouped by concern
|
|
58
59
|
mdLines.push(`| ${bt}${toolPrefix}_core${bt} (vault) | ${bt}search_intelligent${bt}, ${bt}capture_knowledge${bt}, ${bt}capture_quick${bt}, ${bt}search_feedback${bt} |`, `| ${bt}${toolPrefix}_core${bt} (memory) | ${bt}memory_search${bt}, ${bt}memory_capture${bt}, ${bt}session_capture${bt} |`, `| ${bt}${toolPrefix}_core${bt} (planning) | ${bt}create_plan${bt}, ${bt}approve_plan${bt}, ${bt}plan_split${bt}, ${bt}plan_reconcile${bt}, ${bt}plan_complete_lifecycle${bt} |`, `| ${bt}${toolPrefix}_core${bt} (orchestrate) | ${bt}orchestrate_plan${bt}, ${bt}orchestrate_execute${bt}, ${bt}orchestrate_complete${bt} |`, `| ${bt}${toolPrefix}_core${bt} (brain) | ${bt}brain_stats${bt}, ${bt}brain_feedback${bt}, ${bt}rebuild_vocabulary${bt} |`, `| ${bt}${toolPrefix}_core${bt} (control) | ${bt}route_intent${bt}, ${bt}morph${bt}, ${bt}get_behavior_rules${bt} |`, `| ${bt}${toolPrefix}_core${bt} (loop) | ${bt}loop_start${bt}, ${bt}loop_iterate${bt}, ${bt}loop_status${bt}, ${bt}loop_cancel${bt} |`, `| ${bt}${toolPrefix}_core${bt} (governance) | ${bt}governance_dashboard${bt}, ${bt}governance_policy${bt}, ${bt}governance_proposals${bt} |`, `| ${bt}${toolPrefix}_core${bt} (admin) | ${bt}admin_health${bt}, ${bt}admin_tool_list${bt}, ${bt}admin_diagnostic${bt} |`);
|
|
59
60
|
mdLines.push('', `> Full list: ${bt}${toolPrefix}_core op:admin_tool_list${bt}`, '');
|
|
60
|
-
// ─── Shared Behavioral Rules ───────────────────────────
|
|
61
|
-
mdLines.push(...getSharedRules(toolPrefix));
|
|
62
61
|
// ─── Hook Packs (conditional) ──────────────────────────
|
|
63
62
|
appendHookPacks(mdLines, config);
|
|
64
63
|
// ─── Closing marker ────────────────────────────────────
|
|
@@ -68,11 +67,19 @@ export function generateClaudeMdTemplate(config) {
|
|
|
68
67
|
const escaped = line.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
69
68
|
return ` '${escaped}',`;
|
|
70
69
|
});
|
|
70
|
+
// Generate engine rules as a quoted string literal
|
|
71
|
+
const engineContent = getEngineRulesContent();
|
|
72
|
+
const engineQuotedLines = engineContent.split('\n').map((line) => {
|
|
73
|
+
const escaped = line.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
|
|
74
|
+
return ` '${escaped}',`;
|
|
75
|
+
});
|
|
71
76
|
return [
|
|
72
77
|
'/**',
|
|
73
78
|
` * CLAUDE.md content for ${config.name}.`,
|
|
74
79
|
' * Generated by Soleri — do not edit manually.',
|
|
75
80
|
' */',
|
|
81
|
+
'',
|
|
82
|
+
'/** Agent-specific block (identity + activation + facade table). */',
|
|
76
83
|
'export function getClaudeMdContent(): string {',
|
|
77
84
|
' return [',
|
|
78
85
|
...quotedLines,
|
|
@@ -82,6 +89,17 @@ export function generateClaudeMdTemplate(config) {
|
|
|
82
89
|
'export function getClaudeMdMarker(): string {',
|
|
83
90
|
` return '${marker}';`,
|
|
84
91
|
'}',
|
|
92
|
+
'',
|
|
93
|
+
'/** Shared engine rules — injected once, skipped if already present. */',
|
|
94
|
+
'export function getEngineRulesContent(): string {',
|
|
95
|
+
' return [',
|
|
96
|
+
...engineQuotedLines,
|
|
97
|
+
" ].join('\\n');",
|
|
98
|
+
'}',
|
|
99
|
+
'',
|
|
100
|
+
'export function getEngineRulesMarker(): string {',
|
|
101
|
+
` return '${getEngineMarker()}';`,
|
|
102
|
+
'}',
|
|
85
103
|
].join('\n');
|
|
86
104
|
}
|
|
87
105
|
function appendHookPacks(mdLines, config) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md-template.js","sourceRoot":"","sources":["../../src/templates/claude-md-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude-md-template.js","sourceRoot":"","sources":["../../src/templates/claude-md-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,27 +13,27 @@ export function generateInjectClaudeMd(config) {
|
|
|
13
13
|
"import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';",
|
|
14
14
|
"import { homedir } from 'node:os';",
|
|
15
15
|
"import { join } from 'node:path';",
|
|
16
|
-
"import { getClaudeMdContent, getClaudeMdMarker } from './claude-md-content.js';",
|
|
16
|
+
"import { getClaudeMdContent, getClaudeMdMarker, getEngineRulesContent, getEngineRulesMarker } from './claude-md-content.js';",
|
|
17
17
|
'',
|
|
18
18
|
'export interface InjectResult {',
|
|
19
19
|
' injected: boolean;',
|
|
20
20
|
' path: string;',
|
|
21
21
|
" action: 'created' | 'updated' | 'appended';",
|
|
22
|
+
' engineRules?: boolean;',
|
|
22
23
|
'}',
|
|
23
24
|
'',
|
|
24
25
|
'/**',
|
|
25
|
-
' * Inject into a
|
|
26
|
-
' *
|
|
26
|
+
' * Inject a marker-delimited block into a file.',
|
|
27
|
+
' * If the marker already exists, replaces the content between markers.',
|
|
28
|
+
' * Otherwise appends (or creates the file).',
|
|
27
29
|
' */',
|
|
28
|
-
|
|
29
|
-
' const content = getClaudeMdContent();',
|
|
30
|
-
' const marker = getClaudeMdMarker();',
|
|
30
|
+
"function injectBlock(filePath: string, content: string, marker: string): 'created' | 'updated' | 'appended' | 'skipped' {",
|
|
31
31
|
` const startMarker = '<!-- ' + marker + ' -->';`,
|
|
32
32
|
` const endMarker = '<!-- /' + marker + ' -->';`,
|
|
33
33
|
'',
|
|
34
34
|
' if (!existsSync(filePath)) {',
|
|
35
35
|
" writeFileSync(filePath, content + '\\n', 'utf-8');",
|
|
36
|
-
" return
|
|
36
|
+
" return 'created';",
|
|
37
37
|
' }',
|
|
38
38
|
'',
|
|
39
39
|
" const existing = readFileSync(filePath, 'utf-8');",
|
|
@@ -44,30 +44,52 @@ export function generateInjectClaudeMd(config) {
|
|
|
44
44
|
' if (endIdx === -1) {',
|
|
45
45
|
" const updated = existing.slice(0, startIdx) + content + '\\n' + existing.slice(startIdx + startMarker.length);",
|
|
46
46
|
" writeFileSync(filePath, updated, 'utf-8');",
|
|
47
|
-
" return
|
|
47
|
+
" return 'updated';",
|
|
48
48
|
' }',
|
|
49
49
|
' const updated = existing.slice(0, startIdx) + content + existing.slice(endIdx + endMarker.length);',
|
|
50
50
|
" writeFileSync(filePath, updated, 'utf-8');",
|
|
51
|
-
" return
|
|
51
|
+
" return 'updated';",
|
|
52
52
|
' }',
|
|
53
53
|
'',
|
|
54
54
|
" const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n';",
|
|
55
55
|
" writeFileSync(filePath, existing + separator + content + '\\n', 'utf-8');",
|
|
56
|
-
" return
|
|
56
|
+
" return 'appended';",
|
|
57
|
+
'}',
|
|
58
|
+
'',
|
|
59
|
+
'/**',
|
|
60
|
+
' * Inject engine rules + agent block into a CLAUDE.md file.',
|
|
61
|
+
' *',
|
|
62
|
+
' * Engine rules (shared, prefix-free) are injected ONCE under',
|
|
63
|
+
' * `<!-- soleri:engine-rules -->`. If already present, they are updated.',
|
|
64
|
+
' * Agent block (identity + facade table) is injected under',
|
|
65
|
+
` * \`<!-- ${marker} -->\`.`,
|
|
66
|
+
' */',
|
|
67
|
+
'function injectIntoFile(filePath: string): InjectResult {',
|
|
68
|
+
' // Step 1: Engine rules — shared across all agents',
|
|
69
|
+
' const engineAction = injectBlock(filePath, getEngineRulesContent(), getEngineRulesMarker());',
|
|
70
|
+
'',
|
|
71
|
+
' // Step 2: Agent-specific block',
|
|
72
|
+
' const agentAction = injectBlock(filePath, getClaudeMdContent(), getClaudeMdMarker());',
|
|
73
|
+
'',
|
|
74
|
+
' return {',
|
|
75
|
+
' injected: true,',
|
|
76
|
+
' path: filePath,',
|
|
77
|
+
" action: agentAction === 'skipped' ? 'appended' : agentAction,",
|
|
78
|
+
" engineRules: engineAction !== 'skipped',",
|
|
79
|
+
' };',
|
|
57
80
|
'}',
|
|
58
81
|
'',
|
|
59
82
|
'/**',
|
|
60
83
|
' * Inject agent CLAUDE.md section into a project.',
|
|
61
|
-
' * -
|
|
62
|
-
' * -
|
|
63
|
-
' * - If no markers: appends section to end',
|
|
84
|
+
' * - Engine rules: injected once, updated if already present',
|
|
85
|
+
' * - Agent block: created, updated, or appended',
|
|
64
86
|
' */',
|
|
65
87
|
'export function injectClaudeMd(projectPath: string): InjectResult {',
|
|
66
88
|
" return injectIntoFile(join(projectPath, 'CLAUDE.md'));",
|
|
67
89
|
'}',
|
|
68
90
|
'',
|
|
69
91
|
'/**',
|
|
70
|
-
' * Inject
|
|
92
|
+
' * Inject into the global ~/.claude/CLAUDE.md.',
|
|
71
93
|
" * Creates ~/.claude/ directory if it doesn't exist.",
|
|
72
94
|
' * This makes the activation phrase work in any project.',
|
|
73
95
|
' */',
|
|
@@ -80,39 +102,48 @@ export function generateInjectClaudeMd(config) {
|
|
|
80
102
|
'}',
|
|
81
103
|
'',
|
|
82
104
|
'/**',
|
|
83
|
-
' * Remove
|
|
84
|
-
' * Returns true if the section was found and removed.',
|
|
105
|
+
' * Remove a marker-delimited block from a file.',
|
|
85
106
|
' */',
|
|
86
|
-
'function
|
|
87
|
-
' if (!existsSync(filePath)) return
|
|
107
|
+
'function removeBlock(filePath: string, marker: string): boolean {',
|
|
108
|
+
' if (!existsSync(filePath)) return false;',
|
|
88
109
|
" const existing = readFileSync(filePath, 'utf-8');",
|
|
89
|
-
' const marker = getClaudeMdMarker();',
|
|
90
110
|
` const startMarker = '<!-- ' + marker + ' -->';`,
|
|
91
111
|
` const endMarker = '<!-- /' + marker + ' -->';`,
|
|
92
112
|
' const startIdx = existing.indexOf(startMarker);',
|
|
93
|
-
' if (startIdx === -1) return
|
|
113
|
+
' if (startIdx === -1) return false;',
|
|
94
114
|
' const endIdx = existing.indexOf(endMarker);',
|
|
95
|
-
' if (endIdx === -1) return
|
|
115
|
+
' if (endIdx === -1) return false;',
|
|
96
116
|
" const before = existing.slice(0, startIdx).replace(/\\n+$/, '');",
|
|
97
117
|
" const after = existing.slice(endIdx + endMarker.length).replace(/^\\n+/, '');",
|
|
98
118
|
" const cleaned = before + (before && after ? '\\n\\n' : '') + after;",
|
|
99
119
|
" writeFileSync(filePath, cleaned || '', 'utf-8');",
|
|
100
|
-
' return
|
|
120
|
+
' return true;',
|
|
101
121
|
'}',
|
|
102
122
|
'',
|
|
103
123
|
'/**',
|
|
104
124
|
' * Remove agent section from the global ~/.claude/CLAUDE.md.',
|
|
105
|
-
' *
|
|
125
|
+
' * Only removes the agent block, NOT the shared engine rules',
|
|
126
|
+
' * (other agents may depend on them).',
|
|
106
127
|
' */',
|
|
107
128
|
'export function removeClaudeMdGlobal(): { removed: boolean; path: string } {',
|
|
108
|
-
"
|
|
129
|
+
" const filePath = join(homedir(), '.claude', 'CLAUDE.md');",
|
|
130
|
+
' return { removed: removeBlock(filePath, getClaudeMdMarker()), path: filePath };',
|
|
109
131
|
'}',
|
|
110
132
|
'',
|
|
111
133
|
'/**',
|
|
112
134
|
' * Remove agent section from a project CLAUDE.md.',
|
|
113
135
|
' */',
|
|
114
136
|
'export function removeClaudeMd(projectPath: string): { removed: boolean; path: string } {',
|
|
115
|
-
"
|
|
137
|
+
" const filePath = join(projectPath, 'CLAUDE.md');",
|
|
138
|
+
' return { removed: removeBlock(filePath, getClaudeMdMarker()), path: filePath };',
|
|
139
|
+
'}',
|
|
140
|
+
'',
|
|
141
|
+
'/**',
|
|
142
|
+
' * Remove shared engine rules from a file.',
|
|
143
|
+
' * Use only when NO agents remain in the file.',
|
|
144
|
+
' */',
|
|
145
|
+
'export function removeEngineRules(filePath: string): boolean {',
|
|
146
|
+
' return removeBlock(filePath, getEngineRulesMarker());',
|
|
116
147
|
'}',
|
|
117
148
|
'',
|
|
118
149
|
'/**',
|
|
@@ -123,6 +154,15 @@ export function generateInjectClaudeMd(config) {
|
|
|
123
154
|
" const content = readFileSync(filePath, 'utf-8');",
|
|
124
155
|
` return content.includes('<!-- ${marker} -->');`,
|
|
125
156
|
'}',
|
|
157
|
+
'',
|
|
158
|
+
'/**',
|
|
159
|
+
' * Check if engine rules are already present in a CLAUDE.md file.',
|
|
160
|
+
' */',
|
|
161
|
+
'export function hasEngineRules(filePath: string): boolean {',
|
|
162
|
+
' if (!existsSync(filePath)) return false;',
|
|
163
|
+
" const content = readFileSync(filePath, 'utf-8');",
|
|
164
|
+
" return content.includes('<!-- ' + getEngineRulesMarker() + ' -->');",
|
|
165
|
+
'}',
|
|
126
166
|
].join('\n');
|
|
127
167
|
}
|
|
128
168
|
//# sourceMappingURL=inject-claude-md.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inject-claude-md.js","sourceRoot":"","sources":["../../src/templates/inject-claude-md.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC;IAEnC,OAAO;QACL,+EAA+E;QAC/E,oCAAoC;QACpC,mCAAmC;QACnC,
|
|
1
|
+
{"version":3,"file":"inject-claude-md.js","sourceRoot":"","sources":["../../src/templates/inject-claude-md.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAmB;IACxD,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,OAAO,CAAC;IAEnC,OAAO;QACL,+EAA+E;QAC/E,oCAAoC;QACpC,mCAAmC;QACnC,8HAA8H;QAC9H,EAAE;QACF,iCAAiC;QACjC,sBAAsB;QACtB,iBAAiB;QACjB,+CAA+C;QAC/C,0BAA0B;QAC1B,GAAG;QACH,EAAE;QACF,KAAK;QACL,iDAAiD;QACjD,wEAAwE;QACxE,6CAA6C;QAC7C,KAAK;QACL,2HAA2H;QAC3H,kDAAkD;QAClD,iDAAiD;QACjD,EAAE;QACF,gCAAgC;QAChC,wDAAwD;QACxD,uBAAuB;QACvB,KAAK;QACL,EAAE;QACF,qDAAqD;QACrD,EAAE;QACF,yCAAyC;QACzC,qDAAqD;QACrD,iDAAiD;QACjD,0BAA0B;QAC1B,sHAAsH;QACtH,kDAAkD;QAClD,yBAAyB;QACzB,OAAO;QACP,wGAAwG;QACxG,gDAAgD;QAChD,uBAAuB;QACvB,KAAK;QACL,EAAE;QACF,kEAAkE;QAClE,6EAA6E;QAC7E,sBAAsB;QACtB,GAAG;QACH,EAAE;QACF,KAAK;QACL,6DAA6D;QAC7D,IAAI;QACJ,+DAA+D;QAC/D,0EAA0E;QAC1E,4DAA4D;QAC5D,aAAa,MAAM,SAAS;QAC5B,KAAK;QACL,2DAA2D;QAC3D,sDAAsD;QACtD,gGAAgG;QAChG,EAAE;QACF,mCAAmC;QACnC,yFAAyF;QACzF,EAAE;QACF,YAAY;QACZ,qBAAqB;QACrB,qBAAqB;QACrB,mEAAmE;QACnE,8CAA8C;QAC9C,MAAM;QACN,GAAG;QACH,EAAE;QACF,KAAK;QACL,mDAAmD;QACnD,8DAA8D;QAC9D,iDAAiD;QACjD,KAAK;QACL,qEAAqE;QACrE,0DAA0D;QAC1D,GAAG;QACH,EAAE;QACF,KAAK;QACL,gDAAgD;QAChD,sDAAsD;QACtD,0DAA0D;QAC1D,KAAK;QACL,wDAAwD;QACxD,iDAAiD;QACjD,iCAAiC;QACjC,gDAAgD;QAChD,KAAK;QACL,wDAAwD;QACxD,GAAG;QACH,EAAE;QACF,KAAK;QACL,iDAAiD;QACjD,KAAK;QACL,mEAAmE;QACnE,4CAA4C;QAC5C,qDAAqD;QACrD,kDAAkD;QAClD,iDAAiD;QACjD,mDAAmD;QACnD,sCAAsC;QACtC,+CAA+C;QAC/C,oCAAoC;QACpC,oEAAoE;QACpE,iFAAiF;QACjF,uEAAuE;QACvE,oDAAoD;QACpD,gBAAgB;QAChB,GAAG;QACH,EAAE;QACF,KAAK;QACL,8DAA8D;QAC9D,8DAA8D;QAC9D,uCAAuC;QACvC,KAAK;QACL,8EAA8E;QAC9E,6DAA6D;QAC7D,mFAAmF;QACnF,GAAG;QACH,EAAE;QACF,KAAK;QACL,mDAAmD;QACnD,KAAK;QACL,2FAA2F;QAC3F,oDAAoD;QACpD,mFAAmF;QACnF,GAAG;QACH,EAAE;QACF,KAAK;QACL,4CAA4C;QAC5C,gDAAgD;QAChD,KAAK;QACL,gEAAgE;QAChE,yDAAyD;QACzD,GAAG;QACH,EAAE;QACF,KAAK;QACL,0DAA0D;QAC1D,KAAK;QACL,6DAA6D;QAC7D,4CAA4C;QAC5C,oDAAoD;QACpD,mCAAmC,MAAM,SAAS;QAClD,GAAG;QACH,EAAE;QACF,KAAK;QACL,mEAAmE;QACnE,KAAK;QACL,6DAA6D;QAC7D,4CAA4C;QAC5C,oDAAoD;QACpD,uEAAuE;QACvE,GAAG;KACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared
|
|
2
|
+
* Shared Soleri engine rules — agent-agnostic.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* These rules are injected ONCE into global ~/.claude/CLAUDE.md under
|
|
5
|
+
* the `<!-- soleri:engine-rules -->` marker. They describe behavioral
|
|
6
|
+
* rules WITHOUT tool prefixes. The active agent's facade table (in its
|
|
7
|
+
* own `<!-- agent-id:mode -->` block) maps op names to actual tools.
|
|
8
|
+
*
|
|
9
|
+
* Uses op:name syntax — the active agent provides the tool prefix.
|
|
7
10
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
export declare function getEngineMarker(): string;
|
|
12
|
+
/** Returns the full engine rules markdown content (with markers). */
|
|
13
|
+
export declare function getEngineRulesContent(): string;
|