claude-flow-novice 2.5.2 → 2.6.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/.claude/agents/CLAUDE.md +740 -978
- package/.claude/agents/core-agents/cost-savings-cfn-loop-coordinator.md +47 -2
- package/.claude/agents/custom/agent-builder.md +637 -0
- package/.claude/api-configs/config-current-zai-config.env +62 -0
- package/.claude/api-configs/config-test-zai-config.env +62 -0
- package/.claude/api-configs/env-backups/before-anthropic-20251020-025404.env +62 -0
- package/.claude/api-configs/env-backups/before-restore-20251020-025431.env +62 -0
- package/.claude/artifacts/reflection-merge-logs/cli-agent-spawning-v2.5.2-merge-report.md +61 -0
- package/.claude/commands/cfn-loop-epic.md +41 -17
- package/.claude/commands/cfn-loop.md +43 -30
- package/.claude/commands/custom-routing-activate.md +37 -123
- package/.claude/commands/custom-routing-deactivate.md +27 -124
- package/.claude/commands/switch-api.md +41 -16
- package/.claude/skills/agent-execution/execute-agent.sh +126 -0
- package/.claude/skills/redis-coordination/AGENT_LOGGING.md +280 -0
- package/.claude/skills/redis-coordination/agent-log.sh +124 -0
- package/.claude/skills/redis-coordination/init-swarm.sh +6 -1
- package/.claude/skills/redis-coordination/invoke-waiting-mode.sh +62 -5
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh +68 -8
- package/.claude/skills/redis-coordination/orchestrate-cfn-loop.sh.backup-1760949407 +933 -0
- package/.claude/skills/redis-coordination/store-epic-context.sh +123 -0
- package/.claude/skills/redis-coordination/test-iteration-feedback.sh +320 -0
- package/.claude/skills/skill-builder/SKILL.md +910 -0
- package/CLAUDE.md +76 -2
- package/dist/cli/agent-command.js +151 -0
- package/dist/cli/agent-command.js.map +1 -0
- package/dist/cli/agent-definition-parser.js +176 -0
- package/dist/cli/agent-definition-parser.js.map +1 -0
- package/dist/cli/agent-executor.js +176 -0
- package/dist/cli/agent-executor.js.map +1 -0
- package/dist/cli/agent-prompt-builder.js +188 -0
- package/dist/cli/agent-prompt-builder.js.map +1 -0
- package/dist/cli/agent-spawn.js +46 -1
- package/dist/cli/agent-spawn.js.map +1 -1
- package/dist/cli/anthropic-client.js +242 -0
- package/dist/cli/anthropic-client.js.map +1 -0
- package/dist/cli/cli-agent-context.js +353 -0
- package/dist/cli/cli-agent-context.js.map +1 -0
- package/dist/cli/cli-agent-context.test.js +451 -0
- package/dist/cli/cli-agent-context.test.js.map +1 -0
- package/dist/cli/index.js +115 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/iteration-history.js +188 -0
- package/dist/cli/iteration-history.js.map +1 -0
- package/package.json +3 -1
- package/scripts/switch-api.sh +233 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/anthropic-client.ts"],"sourcesContent":["/**\r\n * Anthropic API Client\r\n *\r\n * Handles communication with Claude API (Anthropic or z.ai provider).\r\n * Supports streaming responses and tool execution.\r\n */\r\n\r\nimport Anthropic from '@anthropic-ai/sdk';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\nexport interface APIConfig {\r\n provider: 'anthropic' | 'zai';\r\n apiKey?: string;\r\n baseURL?: string;\r\n}\r\n\r\nexport interface MessageOptions {\r\n model: string;\r\n prompt: string;\r\n systemPrompt?: string;\r\n maxTokens?: number;\r\n temperature?: number;\r\n stream?: boolean;\r\n tools?: any[];\r\n}\r\n\r\nexport interface MessageResponse {\r\n content: string;\r\n usage: {\r\n inputTokens: number;\r\n outputTokens: number;\r\n };\r\n stopReason: string;\r\n}\r\n\r\n/**\r\n * Get API configuration from environment and config files\r\n */\r\nexport async function getAPIConfig(): Promise<APIConfig> {\r\n // Check environment variable\r\n const envProvider = process.env.CLAUDE_API_PROVIDER;\r\n if (envProvider === 'zai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n\r\n // Check config file\r\n try {\r\n const configPath = path.join('.claude', 'config', 'api-provider.json');\r\n const config = JSON.parse(await fs.readFile(configPath, 'utf-8'));\r\n\r\n if (config.provider === 'zai' || config.provider === 'z.ai') {\r\n return {\r\n provider: 'zai',\r\n apiKey: config.apiKey || process.env.ZAI_API_KEY || process.env.ANTHROPIC_API_KEY,\r\n baseURL: config.baseURL || process.env.ZAI_BASE_URL || 'https://api.z.ai/api/anthropic',\r\n };\r\n }\r\n } catch {\r\n // Config file doesn't exist, use defaults\r\n }\r\n\r\n // Default to Anthropic\r\n return {\r\n provider: 'anthropic',\r\n apiKey: process.env.ANTHROPIC_API_KEY,\r\n };\r\n}\r\n\r\n/**\r\n * Create Anthropic client with appropriate configuration\r\n */\r\nexport async function createClient(): Promise<Anthropic> {\r\n const config = await getAPIConfig();\r\n\r\n if (!config.apiKey) {\r\n throw new Error(\r\n `API key not found. Set ${config.provider === 'zai' ? 'ZAI_API_KEY' : 'ANTHROPIC_API_KEY'} environment variable.`\r\n );\r\n }\r\n\r\n const clientOptions: any = {\r\n apiKey: config.apiKey,\r\n timeout: 120000, // 2 minutes (120 seconds)\r\n maxRetries: 2,\r\n };\r\n\r\n if (config.provider === 'zai' && config.baseURL) {\r\n clientOptions.baseURL = config.baseURL;\r\n }\r\n\r\n return new Anthropic(clientOptions);\r\n}\r\n\r\n/**\r\n * Map agent model name to API model ID (provider-specific)\r\n */\r\nexport function mapModelName(agentModel: string, provider: 'anthropic' | 'zai' = 'anthropic'): string {\r\n // Z.ai uses GLM models - try glm-4.6 first for all models\r\n if (provider === 'zai') {\r\n const zaiModelMap: Record<string, string> = {\r\n haiku: 'glm-4.6',\r\n sonnet: 'glm-4.6',\r\n opus: 'glm-4.6',\r\n };\r\n return zaiModelMap[agentModel] || 'glm-4.6';\r\n }\r\n\r\n // Anthropic uses Claude models\r\n const modelMap: Record<string, string> = {\r\n haiku: 'claude-3-5-haiku-20241022',\r\n sonnet: 'claude-3-5-sonnet-20241022',\r\n opus: 'claude-3-opus-20240229',\r\n };\r\n\r\n return modelMap[agentModel] || modelMap.haiku;\r\n}\r\n\r\n/**\r\n * Get fallback model for Z.ai (glm-4.6 -> glm-4.5-air)\r\n */\r\nfunction getFallbackModel(model: string): string | null {\r\n if (model === 'glm-4.6') {\r\n return 'glm-4.5-air';\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Send message to Claude API with streaming support and automatic fallback\r\n */\r\nexport async function sendMessage(\r\n options: MessageOptions,\r\n onChunk?: (text: string) => void\r\n): Promise<MessageResponse> {\r\n const client = await createClient();\r\n const config = await getAPIConfig();\r\n\r\n // Primary model (glm-4.6 for Z.ai, Claude for Anthropic)\r\n let model = mapModelName(options.model, config.provider);\r\n const maxTokens = options.maxTokens || 4096;\r\n const temperature = options.temperature ?? 1.0;\r\n\r\n // Disable streaming for Z.ai (compatibility issue)\r\n const enableStreaming = options.stream && config.provider !== 'zai';\r\n\r\n console.log(`[anthropic-client] Provider: ${config.provider}`);\r\n console.log(`[anthropic-client] Model: ${model}`);\r\n console.log(`[anthropic-client] Max tokens: ${maxTokens}`);\r\n console.log(`[anthropic-client] Stream: ${enableStreaming ? 'enabled' : 'disabled'}`);\r\n console.log('');\r\n\r\n const messages: Anthropic.MessageParam[] = [\r\n {\r\n role: 'user',\r\n content: options.prompt,\r\n },\r\n ];\r\n\r\n // Retry logic: Try primary model (glm-4.6), fall back to glm-4.5 on error\r\n let lastError: Error | null = null;\r\n let attempts = 0;\r\n const maxAttempts = 2; // Primary + fallback\r\n\r\n while (attempts < maxAttempts) {\r\n const currentModel = attempts === 0 ? model : getFallbackModel(model);\r\n\r\n if (!currentModel) {\r\n // No fallback available, throw last error\r\n throw lastError || new Error('No model available');\r\n }\r\n\r\n attempts++;\r\n\r\n if (attempts > 1) {\r\n console.log(`[anthropic-client] Retrying with fallback model: ${currentModel}`);\r\n }\r\n\r\n const requestParams: Anthropic.MessageCreateParams = {\r\n model: currentModel,\r\n max_tokens: maxTokens,\r\n temperature,\r\n messages,\r\n };\r\n\r\n if (options.systemPrompt) {\r\n requestParams.system = options.systemPrompt;\r\n }\r\n\r\n if (options.tools && options.tools.length > 0) {\r\n requestParams.tools = options.tools;\r\n }\r\n\r\n try {\r\n // Streaming response\r\n if (enableStreaming) {\r\n let fullContent = '';\r\n let inputTokens = 0;\r\n let outputTokens = 0;\r\n let stopReason = 'end_turn';\r\n\r\n console.log('[anthropic-client] Creating streaming request...');\r\n const stream = await client.messages.create({\r\n ...requestParams,\r\n stream: true,\r\n });\r\n\r\n console.log('[anthropic-client] Stream created, processing events...');\r\n for await (const event of stream) {\r\n console.log('[anthropic-client] Event type:', event.type);\r\n if (event.type === 'message_start') {\r\n // @ts-ignore - usage exists on message_start\r\n inputTokens = event.message.usage?.input_tokens || 0;\r\n } else if (event.type === 'content_block_delta') {\r\n // @ts-ignore - text exists on delta\r\n const text = event.delta?.text || '';\r\n fullContent += text;\r\n if (onChunk) {\r\n onChunk(text);\r\n }\r\n } else if (event.type === 'message_delta') {\r\n // @ts-ignore - usage exists on message_delta\r\n outputTokens = event.usage?.output_tokens || 0;\r\n // @ts-ignore - stop_reason exists on delta\r\n stopReason = event.delta?.stop_reason || 'end_turn';\r\n }\r\n }\r\n\r\n return {\r\n content: fullContent,\r\n usage: {\r\n inputTokens,\r\n outputTokens,\r\n },\r\n stopReason,\r\n };\r\n }\r\n\r\n // Non-streaming response\r\n const response = await client.messages.create(requestParams);\r\n\r\n const content =\r\n response.content\r\n .filter((block) => block.type === 'text')\r\n .map((block) => (block as any).text)\r\n .join('\\n') || '';\r\n\r\n return {\r\n content,\r\n usage: {\r\n inputTokens: response.usage.input_tokens,\r\n outputTokens: response.usage.output_tokens,\r\n },\r\n stopReason: response.stop_reason || 'end_turn',\r\n };\r\n } catch (error) {\r\n lastError = error instanceof Error ? error : new Error(String(error));\r\n console.error(`[anthropic-client] Error with model ${currentModel}:`, lastError.message);\r\n\r\n // If this was the last attempt, throw the error\r\n if (attempts >= maxAttempts) {\r\n throw lastError;\r\n }\r\n\r\n // Continue to next attempt with fallback model\r\n console.log('[anthropic-client] Will retry with fallback model...');\r\n }\r\n }\r\n\r\n // Should never reach here\r\n throw lastError || new Error('All retry attempts failed');\r\n}\r\n\r\n/**\r\n * Execute agent via API with full lifecycle\r\n */\r\nexport async function executeAgentAPI(\r\n agentType: string,\r\n agentId: string,\r\n model: string,\r\n prompt: string,\r\n systemPrompt?: string\r\n): Promise<{ success: boolean; output: string; usage: any; error?: string }> {\r\n try {\r\n console.log(`[anthropic-client] Executing agent: ${agentType}`);\r\n console.log(`[anthropic-client] Agent ID: ${agentId}`);\r\n console.log('');\r\n\r\n let fullOutput = '';\r\n\r\n const response = await sendMessage(\r\n {\r\n model,\r\n prompt,\r\n systemPrompt,\r\n stream: true,\r\n },\r\n (chunk) => {\r\n // Stream output in real-time\r\n process.stdout.write(chunk);\r\n fullOutput += chunk;\r\n }\r\n );\r\n\r\n console.log('\\n');\r\n console.log('=== Agent Execution Complete ===');\r\n console.log(`Input tokens: ${response.usage.inputTokens}`);\r\n console.log(`Output tokens: ${response.usage.outputTokens}`);\r\n console.log(`Stop reason: ${response.stopReason}`);\r\n\r\n return {\r\n success: true,\r\n output: response.content,\r\n usage: response.usage,\r\n };\r\n } catch (error) {\r\n console.error('[anthropic-client] Error:', error);\r\n return {\r\n success: false,\r\n output: '',\r\n usage: { inputTokens: 0, outputTokens: 0 },\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n }\r\n}\r\n"],"names":["Anthropic","fs","path","getAPIConfig","envProvider","process","env","CLAUDE_API_PROVIDER","provider","apiKey","ZAI_API_KEY","ANTHROPIC_API_KEY","baseURL","ZAI_BASE_URL","configPath","join","config","JSON","parse","readFile","createClient","Error","clientOptions","timeout","maxRetries","mapModelName","agentModel","zaiModelMap","haiku","sonnet","opus","modelMap","getFallbackModel","model","sendMessage","options","onChunk","client","maxTokens","temperature","enableStreaming","stream","console","log","messages","role","content","prompt","lastError","attempts","maxAttempts","currentModel","requestParams","max_tokens","systemPrompt","system","tools","length","fullContent","inputTokens","outputTokens","stopReason","create","event","type","message","usage","input_tokens","text","delta","output_tokens","stop_reason","response","filter","block","map","error","String","executeAgentAPI","agentType","agentId","fullOutput","chunk","stdout","write","success","output"],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Agent Context Builder
|
|
3
|
+
*
|
|
4
|
+
* Builds natural language system prompts for CLI-spawned agents.
|
|
5
|
+
* Converts JSON context from Redis into readable markdown format.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: System Prompts Enhancement (Sprint 2)
|
|
8
|
+
* - Load CLAUDE.md (project rules)
|
|
9
|
+
* - Load agent markdown template
|
|
10
|
+
* - Format epic/phase/success criteria as natural language
|
|
11
|
+
* - Build comprehensive system prompt for API execution
|
|
12
|
+
*/ import fs from 'fs/promises';
|
|
13
|
+
import path from 'path';
|
|
14
|
+
/**
|
|
15
|
+
* Load CLAUDE.md project rules
|
|
16
|
+
*/ async function loadProjectRules() {
|
|
17
|
+
try {
|
|
18
|
+
// Try current working directory
|
|
19
|
+
const cwdPath = path.join(process.cwd(), 'CLAUDE.md');
|
|
20
|
+
const content = await fs.readFile(cwdPath, 'utf-8');
|
|
21
|
+
return content;
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.warn('[cli-agent-context] Could not load CLAUDE.md:', error);
|
|
24
|
+
return '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Load agent markdown template
|
|
29
|
+
*/ async function loadAgentTemplate(agentType) {
|
|
30
|
+
try {
|
|
31
|
+
// Search in .claude/agents/ subdirectories
|
|
32
|
+
const searchPaths = [
|
|
33
|
+
path.join(process.cwd(), '.claude', 'agents', 'core-agents', `${agentType}.md`),
|
|
34
|
+
path.join(process.cwd(), '.claude', 'agents', 'specialized', `${agentType}.md`),
|
|
35
|
+
path.join(process.cwd(), '.claude', 'agents', 'development', `${agentType}.md`),
|
|
36
|
+
path.join(process.cwd(), '.claude', 'agents', 'security', `${agentType}.md`),
|
|
37
|
+
path.join(process.cwd(), '.claude', 'agents', 'custom', `${agentType}.md`)
|
|
38
|
+
];
|
|
39
|
+
for (const searchPath of searchPaths){
|
|
40
|
+
try {
|
|
41
|
+
const content = await fs.readFile(searchPath, 'utf-8');
|
|
42
|
+
return content;
|
|
43
|
+
} catch {
|
|
44
|
+
// Continue to next path
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
console.warn(`[cli-agent-context] Could not find agent template: ${agentType}.md`);
|
|
48
|
+
return '';
|
|
49
|
+
} catch (error) {
|
|
50
|
+
console.warn('[cli-agent-context] Error loading agent template:', error);
|
|
51
|
+
return '';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse JSON string safely
|
|
56
|
+
*/ function parseJSON(jsonString, fallback) {
|
|
57
|
+
if (!jsonString || jsonString.trim() === '' || jsonString === '(nil)') {
|
|
58
|
+
return fallback;
|
|
59
|
+
}
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(jsonString);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.warn('[cli-agent-context] Failed to parse JSON:', error);
|
|
64
|
+
return fallback;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format epic context as natural language
|
|
69
|
+
*/ function formatEpicContext(epic) {
|
|
70
|
+
if (!epic.epicGoal && !epic.inScope && !epic.outOfScope) {
|
|
71
|
+
return '';
|
|
72
|
+
}
|
|
73
|
+
const sections = [];
|
|
74
|
+
sections.push('## Epic Context');
|
|
75
|
+
sections.push('');
|
|
76
|
+
if (epic.epicGoal) {
|
|
77
|
+
sections.push('**Epic Goal:**');
|
|
78
|
+
sections.push(epic.epicGoal);
|
|
79
|
+
sections.push('');
|
|
80
|
+
}
|
|
81
|
+
if (epic.riskProfile) {
|
|
82
|
+
sections.push(`**Risk Profile:** ${epic.riskProfile}`);
|
|
83
|
+
sections.push('');
|
|
84
|
+
}
|
|
85
|
+
if (epic.inScope && epic.inScope.length > 0) {
|
|
86
|
+
sections.push('**In Scope:**');
|
|
87
|
+
for (const item of epic.inScope){
|
|
88
|
+
sections.push(`- ${item}`);
|
|
89
|
+
}
|
|
90
|
+
sections.push('');
|
|
91
|
+
}
|
|
92
|
+
if (epic.outOfScope && epic.outOfScope.length > 0) {
|
|
93
|
+
sections.push('**Out of Scope:**');
|
|
94
|
+
for (const item of epic.outOfScope){
|
|
95
|
+
sections.push(`- ${item}`);
|
|
96
|
+
}
|
|
97
|
+
sections.push('');
|
|
98
|
+
}
|
|
99
|
+
if (epic.phases && epic.phases.length > 0) {
|
|
100
|
+
sections.push('**Phases:**');
|
|
101
|
+
for(let i = 0; i < epic.phases.length; i++){
|
|
102
|
+
sections.push(`${i + 1}. ${epic.phases[i]}`);
|
|
103
|
+
}
|
|
104
|
+
sections.push('');
|
|
105
|
+
}
|
|
106
|
+
if (epic.stakeholders && epic.stakeholders.length > 0) {
|
|
107
|
+
sections.push(`**Stakeholders:** ${epic.stakeholders.join(', ')}`);
|
|
108
|
+
sections.push('');
|
|
109
|
+
}
|
|
110
|
+
if (epic.timeline) {
|
|
111
|
+
sections.push('**Timeline:**');
|
|
112
|
+
if (epic.timeline.start) sections.push(`- Start: ${epic.timeline.start}`);
|
|
113
|
+
if (epic.timeline.end) sections.push(`- End: ${epic.timeline.end}`);
|
|
114
|
+
if (epic.timeline.milestones && epic.timeline.milestones.length > 0) {
|
|
115
|
+
sections.push('- Milestones:');
|
|
116
|
+
for (const milestone of epic.timeline.milestones){
|
|
117
|
+
sections.push(` - ${milestone.phase}: ${milestone.date}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
sections.push('');
|
|
121
|
+
}
|
|
122
|
+
return sections.join('\n');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Format phase context as natural language
|
|
126
|
+
*/ function formatPhaseContext(phase) {
|
|
127
|
+
if (!phase.currentPhase && !phase.deliverables) {
|
|
128
|
+
return '';
|
|
129
|
+
}
|
|
130
|
+
const sections = [];
|
|
131
|
+
sections.push('## Current Phase');
|
|
132
|
+
sections.push('');
|
|
133
|
+
if (phase.currentPhase) {
|
|
134
|
+
sections.push(`**Phase:** ${phase.currentPhase}`);
|
|
135
|
+
if (phase.phaseNumber) {
|
|
136
|
+
sections.push(`**Phase Number:** ${phase.phaseNumber}`);
|
|
137
|
+
}
|
|
138
|
+
sections.push('');
|
|
139
|
+
}
|
|
140
|
+
if (phase.dependencies && phase.dependencies.length > 0) {
|
|
141
|
+
sections.push('**Dependencies:**');
|
|
142
|
+
for (const dep of phase.dependencies){
|
|
143
|
+
sections.push(`- ${dep}`);
|
|
144
|
+
}
|
|
145
|
+
sections.push('');
|
|
146
|
+
}
|
|
147
|
+
if (phase.deliverables && phase.deliverables.length > 0) {
|
|
148
|
+
sections.push('**Deliverables:**');
|
|
149
|
+
for (const deliverable of phase.deliverables){
|
|
150
|
+
sections.push(`- ${deliverable}`);
|
|
151
|
+
}
|
|
152
|
+
sections.push('');
|
|
153
|
+
}
|
|
154
|
+
if (phase.blockers && phase.blockers.length > 0) {
|
|
155
|
+
sections.push('**Current Blockers:**');
|
|
156
|
+
for (const blocker of phase.blockers){
|
|
157
|
+
sections.push(`- ${blocker}`);
|
|
158
|
+
}
|
|
159
|
+
sections.push('');
|
|
160
|
+
}
|
|
161
|
+
if (phase.resources) {
|
|
162
|
+
sections.push('**Resources:**');
|
|
163
|
+
if (phase.resources.agentCount) sections.push(`- Agents: ${phase.resources.agentCount}`);
|
|
164
|
+
if (phase.resources.estimatedDuration) sections.push(`- Duration: ${phase.resources.estimatedDuration} hours`);
|
|
165
|
+
if (phase.resources.costBudget) sections.push(`- Budget: $${phase.resources.costBudget.toFixed(2)}`);
|
|
166
|
+
sections.push('');
|
|
167
|
+
}
|
|
168
|
+
return sections.join('\n');
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Format success criteria as natural language
|
|
172
|
+
*/ function formatSuccessCriteria(criteria) {
|
|
173
|
+
// Check if any criteria fields are present
|
|
174
|
+
if (!criteria.acceptanceCriteria && !criteria.gateThreshold && !criteria.consensusThreshold && !criteria.qualityGates && !criteria.definitionOfDone && !criteria.nonFunctionalRequirements) {
|
|
175
|
+
return '';
|
|
176
|
+
}
|
|
177
|
+
const sections = [];
|
|
178
|
+
sections.push('## Success Criteria');
|
|
179
|
+
sections.push('');
|
|
180
|
+
if (criteria.acceptanceCriteria && criteria.acceptanceCriteria.length > 0) {
|
|
181
|
+
sections.push('**Acceptance Criteria:**');
|
|
182
|
+
for (const criterion of criteria.acceptanceCriteria){
|
|
183
|
+
sections.push(`- ${criterion}`);
|
|
184
|
+
}
|
|
185
|
+
sections.push('');
|
|
186
|
+
}
|
|
187
|
+
if (criteria.gateThreshold || criteria.consensusThreshold) {
|
|
188
|
+
sections.push('**Quality Gates:**');
|
|
189
|
+
if (criteria.gateThreshold) {
|
|
190
|
+
sections.push(`- Gate Threshold (Loop 3): ${(criteria.gateThreshold * 100).toFixed(0)}%`);
|
|
191
|
+
}
|
|
192
|
+
if (criteria.consensusThreshold) {
|
|
193
|
+
sections.push(`- Consensus Threshold (Loop 2): ${(criteria.consensusThreshold * 100).toFixed(0)}%`);
|
|
194
|
+
}
|
|
195
|
+
sections.push('');
|
|
196
|
+
}
|
|
197
|
+
if (criteria.qualityGates) {
|
|
198
|
+
sections.push('**Quality Metrics:**');
|
|
199
|
+
if (criteria.qualityGates.testCoverage) {
|
|
200
|
+
sections.push(`- Test Coverage: ${criteria.qualityGates.testCoverage}%`);
|
|
201
|
+
}
|
|
202
|
+
if (criteria.qualityGates.securityScore) {
|
|
203
|
+
sections.push(`- Security Score: ${(criteria.qualityGates.securityScore * 100).toFixed(0)}%`);
|
|
204
|
+
}
|
|
205
|
+
if (criteria.qualityGates.performanceBudget) {
|
|
206
|
+
sections.push(`- Performance Budget: ${criteria.qualityGates.performanceBudget}ms`);
|
|
207
|
+
}
|
|
208
|
+
sections.push('');
|
|
209
|
+
}
|
|
210
|
+
if (criteria.definitionOfDone && criteria.definitionOfDone.length > 0) {
|
|
211
|
+
sections.push('**Definition of Done:**');
|
|
212
|
+
for (const item of criteria.definitionOfDone){
|
|
213
|
+
sections.push(`- [ ] ${item}`);
|
|
214
|
+
}
|
|
215
|
+
sections.push('');
|
|
216
|
+
}
|
|
217
|
+
if (criteria.nonFunctionalRequirements && criteria.nonFunctionalRequirements.length > 0) {
|
|
218
|
+
sections.push('**Non-Functional Requirements:**');
|
|
219
|
+
for (const req of criteria.nonFunctionalRequirements){
|
|
220
|
+
sections.push(`- ${req}`);
|
|
221
|
+
}
|
|
222
|
+
sections.push('');
|
|
223
|
+
}
|
|
224
|
+
return sections.join('\n');
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Format iteration context
|
|
228
|
+
*/ function formatIterationContext(iteration, taskId) {
|
|
229
|
+
if (!iteration || iteration === 1) {
|
|
230
|
+
return '';
|
|
231
|
+
}
|
|
232
|
+
return `
|
|
233
|
+
## Current Iteration
|
|
234
|
+
|
|
235
|
+
This is **iteration ${iteration}** of your task.
|
|
236
|
+
|
|
237
|
+
**Previous Iterations:**
|
|
238
|
+
You have completed ${iteration - 1} iteration${iteration > 2 ? 's' : ''} before this one.
|
|
239
|
+
|
|
240
|
+
**Your Goal:**
|
|
241
|
+
Address feedback from previous iterations and improve the quality of your work.
|
|
242
|
+
|
|
243
|
+
**Feedback Access:**
|
|
244
|
+
Check Redis for iteration feedback:
|
|
245
|
+
\`\`\`bash
|
|
246
|
+
redis-cli get "swarm:${taskId}:\${AGENT_ID}:feedback:iteration-${iteration}"
|
|
247
|
+
\`\`\`
|
|
248
|
+
|
|
249
|
+
`;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Build comprehensive system prompt for CLI agent
|
|
253
|
+
*
|
|
254
|
+
* Combines:
|
|
255
|
+
* - Project rules (CLAUDE.md)
|
|
256
|
+
* - Agent markdown template
|
|
257
|
+
* - Epic context (formatted)
|
|
258
|
+
* - Phase context (formatted)
|
|
259
|
+
* - Success criteria (formatted)
|
|
260
|
+
* - Iteration context
|
|
261
|
+
*/ export async function buildCLIAgentSystemPrompt(options) {
|
|
262
|
+
console.log('[cli-agent-context] Building system prompt...');
|
|
263
|
+
const sections = [];
|
|
264
|
+
// 1. Load and include CLAUDE.md
|
|
265
|
+
console.log('[cli-agent-context] Loading CLAUDE.md...');
|
|
266
|
+
const projectRules = await loadProjectRules();
|
|
267
|
+
if (projectRules) {
|
|
268
|
+
sections.push('# Project Rules (CLAUDE.md)');
|
|
269
|
+
sections.push('');
|
|
270
|
+
sections.push(projectRules);
|
|
271
|
+
sections.push('');
|
|
272
|
+
sections.push('---');
|
|
273
|
+
sections.push('');
|
|
274
|
+
}
|
|
275
|
+
// 2. Load and include agent markdown template
|
|
276
|
+
console.log(`[cli-agent-context] Loading agent template: ${options.agentType}`);
|
|
277
|
+
const agentTemplate = await loadAgentTemplate(options.agentType);
|
|
278
|
+
if (agentTemplate) {
|
|
279
|
+
sections.push(`# Agent Definition: ${options.agentType}`);
|
|
280
|
+
sections.push('');
|
|
281
|
+
sections.push(agentTemplate);
|
|
282
|
+
sections.push('');
|
|
283
|
+
sections.push('---');
|
|
284
|
+
sections.push('');
|
|
285
|
+
}
|
|
286
|
+
// 3. Parse and format epic context
|
|
287
|
+
const epicContext = parseJSON(options.epicContext, {});
|
|
288
|
+
const formattedEpic = formatEpicContext(epicContext);
|
|
289
|
+
if (formattedEpic) {
|
|
290
|
+
sections.push(formattedEpic);
|
|
291
|
+
sections.push('---');
|
|
292
|
+
sections.push('');
|
|
293
|
+
}
|
|
294
|
+
// 4. Parse and format phase context
|
|
295
|
+
const phaseContext = parseJSON(options.phaseContext, {});
|
|
296
|
+
const formattedPhase = formatPhaseContext(phaseContext);
|
|
297
|
+
if (formattedPhase) {
|
|
298
|
+
sections.push(formattedPhase);
|
|
299
|
+
sections.push('---');
|
|
300
|
+
sections.push('');
|
|
301
|
+
}
|
|
302
|
+
// 5. Parse and format success criteria
|
|
303
|
+
const successCriteria = parseJSON(options.successCriteria, {});
|
|
304
|
+
const formattedCriteria = formatSuccessCriteria(successCriteria);
|
|
305
|
+
if (formattedCriteria) {
|
|
306
|
+
sections.push(formattedCriteria);
|
|
307
|
+
sections.push('---');
|
|
308
|
+
sections.push('');
|
|
309
|
+
}
|
|
310
|
+
// 6. Format iteration context
|
|
311
|
+
const iterationContext = formatIterationContext(options.iteration, options.taskId);
|
|
312
|
+
if (iterationContext) {
|
|
313
|
+
sections.push(iterationContext);
|
|
314
|
+
sections.push('---');
|
|
315
|
+
sections.push('');
|
|
316
|
+
}
|
|
317
|
+
// 7. Add execution reminder
|
|
318
|
+
sections.push('## Execution Instructions');
|
|
319
|
+
sections.push('');
|
|
320
|
+
sections.push('You are executing as a CLI-spawned agent with full project context.');
|
|
321
|
+
sections.push('Follow the agent definition, project rules, and success criteria exactly.');
|
|
322
|
+
sections.push('');
|
|
323
|
+
sections.push('**Remember:**');
|
|
324
|
+
sections.push('- Respect scope boundaries (in-scope vs out-of-scope)');
|
|
325
|
+
sections.push('- Meet acceptance criteria and quality gates');
|
|
326
|
+
sections.push('- Follow CFN Loop protocol if task-id is provided');
|
|
327
|
+
sections.push('- Report confidence score when complete');
|
|
328
|
+
sections.push('');
|
|
329
|
+
const fullPrompt = sections.join('\n');
|
|
330
|
+
console.log(`[cli-agent-context] System prompt built: ${fullPrompt.length} characters`);
|
|
331
|
+
console.log(`[cli-agent-context] - Project rules: ${projectRules ? 'included' : 'not found'}`);
|
|
332
|
+
console.log(`[cli-agent-context] - Agent template: ${agentTemplate ? 'included' : 'not found'}`);
|
|
333
|
+
console.log(`[cli-agent-context] - Epic context: ${formattedEpic ? 'formatted' : 'none'}`);
|
|
334
|
+
console.log(`[cli-agent-context] - Phase context: ${formattedPhase ? 'formatted' : 'none'}`);
|
|
335
|
+
console.log(`[cli-agent-context] - Success criteria: ${formattedCriteria ? 'formatted' : 'none'}`);
|
|
336
|
+
return fullPrompt;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Helper: Load context from environment variables
|
|
340
|
+
*
|
|
341
|
+
* Used by agent executor to load context from env vars set by cfn-spawn
|
|
342
|
+
*/ export function loadContextFromEnv() {
|
|
343
|
+
return {
|
|
344
|
+
agentType: process.env.AGENT_TYPE || 'unknown',
|
|
345
|
+
taskId: process.env.TASK_ID,
|
|
346
|
+
iteration: process.env.ITERATION ? parseInt(process.env.ITERATION, 10) : 1,
|
|
347
|
+
epicContext: process.env.EPIC_CONTEXT,
|
|
348
|
+
phaseContext: process.env.PHASE_CONTEXT,
|
|
349
|
+
successCriteria: process.env.SUCCESS_CRITERIA
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
//# sourceMappingURL=cli-agent-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/cli-agent-context.ts"],"sourcesContent":["/**\r\n * CLI Agent Context Builder\r\n *\r\n * Builds natural language system prompts for CLI-spawned agents.\r\n * Converts JSON context from Redis into readable markdown format.\r\n *\r\n * Phase 1: System Prompts Enhancement (Sprint 2)\r\n * - Load CLAUDE.md (project rules)\r\n * - Load agent markdown template\r\n * - Format epic/phase/success criteria as natural language\r\n * - Build comprehensive system prompt for API execution\r\n */\r\n\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\nexport interface EpicContext {\r\n epicGoal?: string;\r\n inScope?: string[];\r\n outOfScope?: string[];\r\n phases?: string[];\r\n riskProfile?: string;\r\n stakeholders?: string[];\r\n timeline?: {\r\n start?: string;\r\n end?: string;\r\n milestones?: Array<{ phase: string; date: string }>;\r\n };\r\n}\r\n\r\nexport interface PhaseContext {\r\n currentPhase?: string;\r\n phaseNumber?: number;\r\n dependencies?: string[];\r\n deliverables?: string[];\r\n blockers?: string[];\r\n resources?: {\r\n agentCount?: number;\r\n estimatedDuration?: number;\r\n costBudget?: number;\r\n };\r\n}\r\n\r\nexport interface SuccessCriteria {\r\n acceptanceCriteria?: string[];\r\n gateThreshold?: number;\r\n consensusThreshold?: number;\r\n qualityGates?: {\r\n testCoverage?: number;\r\n securityScore?: number;\r\n performanceBudget?: number;\r\n };\r\n definitionOfDone?: string[];\r\n nonFunctionalRequirements?: string[];\r\n}\r\n\r\nexport interface ContextBuilderOptions {\r\n agentType: string;\r\n taskId?: string;\r\n iteration?: number;\r\n epicContext?: string; // JSON string\r\n phaseContext?: string; // JSON string\r\n successCriteria?: string; // JSON string\r\n}\r\n\r\n/**\r\n * Load CLAUDE.md project rules\r\n */\r\nasync function loadProjectRules(): Promise<string> {\r\n try {\r\n // Try current working directory\r\n const cwdPath = path.join(process.cwd(), 'CLAUDE.md');\r\n const content = await fs.readFile(cwdPath, 'utf-8');\r\n return content;\r\n } catch (error) {\r\n console.warn('[cli-agent-context] Could not load CLAUDE.md:', error);\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Load agent markdown template\r\n */\r\nasync function loadAgentTemplate(agentType: string): Promise<string> {\r\n try {\r\n // Search in .claude/agents/ subdirectories\r\n const searchPaths = [\r\n path.join(process.cwd(), '.claude', 'agents', 'core-agents', `${agentType}.md`),\r\n path.join(process.cwd(), '.claude', 'agents', 'specialized', `${agentType}.md`),\r\n path.join(process.cwd(), '.claude', 'agents', 'development', `${agentType}.md`),\r\n path.join(process.cwd(), '.claude', 'agents', 'security', `${agentType}.md`),\r\n path.join(process.cwd(), '.claude', 'agents', 'custom', `${agentType}.md`),\r\n ];\r\n\r\n for (const searchPath of searchPaths) {\r\n try {\r\n const content = await fs.readFile(searchPath, 'utf-8');\r\n return content;\r\n } catch {\r\n // Continue to next path\r\n }\r\n }\r\n\r\n console.warn(`[cli-agent-context] Could not find agent template: ${agentType}.md`);\r\n return '';\r\n } catch (error) {\r\n console.warn('[cli-agent-context] Error loading agent template:', error);\r\n return '';\r\n }\r\n}\r\n\r\n/**\r\n * Parse JSON string safely\r\n */\r\nfunction parseJSON<T>(jsonString: string | undefined, fallback: T): T {\r\n if (!jsonString || jsonString.trim() === '' || jsonString === '(nil)') {\r\n return fallback;\r\n }\r\n\r\n try {\r\n return JSON.parse(jsonString) as T;\r\n } catch (error) {\r\n console.warn('[cli-agent-context] Failed to parse JSON:', error);\r\n return fallback;\r\n }\r\n}\r\n\r\n/**\r\n * Format epic context as natural language\r\n */\r\nfunction formatEpicContext(epic: EpicContext): string {\r\n if (!epic.epicGoal && !epic.inScope && !epic.outOfScope) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Epic Context');\r\n sections.push('');\r\n\r\n if (epic.epicGoal) {\r\n sections.push('**Epic Goal:**');\r\n sections.push(epic.epicGoal);\r\n sections.push('');\r\n }\r\n\r\n if (epic.riskProfile) {\r\n sections.push(`**Risk Profile:** ${epic.riskProfile}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.inScope && epic.inScope.length > 0) {\r\n sections.push('**In Scope:**');\r\n for (const item of epic.inScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.outOfScope && epic.outOfScope.length > 0) {\r\n sections.push('**Out of Scope:**');\r\n for (const item of epic.outOfScope) {\r\n sections.push(`- ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.phases && epic.phases.length > 0) {\r\n sections.push('**Phases:**');\r\n for (let i = 0; i < epic.phases.length; i++) {\r\n sections.push(`${i + 1}. ${epic.phases[i]}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (epic.stakeholders && epic.stakeholders.length > 0) {\r\n sections.push(`**Stakeholders:** ${epic.stakeholders.join(', ')}`);\r\n sections.push('');\r\n }\r\n\r\n if (epic.timeline) {\r\n sections.push('**Timeline:**');\r\n if (epic.timeline.start) sections.push(`- Start: ${epic.timeline.start}`);\r\n if (epic.timeline.end) sections.push(`- End: ${epic.timeline.end}`);\r\n if (epic.timeline.milestones && epic.timeline.milestones.length > 0) {\r\n sections.push('- Milestones:');\r\n for (const milestone of epic.timeline.milestones) {\r\n sections.push(` - ${milestone.phase}: ${milestone.date}`);\r\n }\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Format phase context as natural language\r\n */\r\nfunction formatPhaseContext(phase: PhaseContext): string {\r\n if (!phase.currentPhase && !phase.deliverables) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Current Phase');\r\n sections.push('');\r\n\r\n if (phase.currentPhase) {\r\n sections.push(`**Phase:** ${phase.currentPhase}`);\r\n if (phase.phaseNumber) {\r\n sections.push(`**Phase Number:** ${phase.phaseNumber}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (phase.dependencies && phase.dependencies.length > 0) {\r\n sections.push('**Dependencies:**');\r\n for (const dep of phase.dependencies) {\r\n sections.push(`- ${dep}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (phase.deliverables && phase.deliverables.length > 0) {\r\n sections.push('**Deliverables:**');\r\n for (const deliverable of phase.deliverables) {\r\n sections.push(`- ${deliverable}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (phase.blockers && phase.blockers.length > 0) {\r\n sections.push('**Current Blockers:**');\r\n for (const blocker of phase.blockers) {\r\n sections.push(`- ${blocker}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (phase.resources) {\r\n sections.push('**Resources:**');\r\n if (phase.resources.agentCount) sections.push(`- Agents: ${phase.resources.agentCount}`);\r\n if (phase.resources.estimatedDuration) sections.push(`- Duration: ${phase.resources.estimatedDuration} hours`);\r\n if (phase.resources.costBudget) sections.push(`- Budget: $${phase.resources.costBudget.toFixed(2)}`);\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Format success criteria as natural language\r\n */\r\nfunction formatSuccessCriteria(criteria: SuccessCriteria): string {\r\n // Check if any criteria fields are present\r\n if (\r\n !criteria.acceptanceCriteria &&\r\n !criteria.gateThreshold &&\r\n !criteria.consensusThreshold &&\r\n !criteria.qualityGates &&\r\n !criteria.definitionOfDone &&\r\n !criteria.nonFunctionalRequirements\r\n ) {\r\n return '';\r\n }\r\n\r\n const sections: string[] = [];\r\n\r\n sections.push('## Success Criteria');\r\n sections.push('');\r\n\r\n if (criteria.acceptanceCriteria && criteria.acceptanceCriteria.length > 0) {\r\n sections.push('**Acceptance Criteria:**');\r\n for (const criterion of criteria.acceptanceCriteria) {\r\n sections.push(`- ${criterion}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (criteria.gateThreshold || criteria.consensusThreshold) {\r\n sections.push('**Quality Gates:**');\r\n if (criteria.gateThreshold) {\r\n sections.push(`- Gate Threshold (Loop 3): ${(criteria.gateThreshold * 100).toFixed(0)}%`);\r\n }\r\n if (criteria.consensusThreshold) {\r\n sections.push(`- Consensus Threshold (Loop 2): ${(criteria.consensusThreshold * 100).toFixed(0)}%`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (criteria.qualityGates) {\r\n sections.push('**Quality Metrics:**');\r\n if (criteria.qualityGates.testCoverage) {\r\n sections.push(`- Test Coverage: ${criteria.qualityGates.testCoverage}%`);\r\n }\r\n if (criteria.qualityGates.securityScore) {\r\n sections.push(`- Security Score: ${(criteria.qualityGates.securityScore * 100).toFixed(0)}%`);\r\n }\r\n if (criteria.qualityGates.performanceBudget) {\r\n sections.push(`- Performance Budget: ${criteria.qualityGates.performanceBudget}ms`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (criteria.definitionOfDone && criteria.definitionOfDone.length > 0) {\r\n sections.push('**Definition of Done:**');\r\n for (const item of criteria.definitionOfDone) {\r\n sections.push(`- [ ] ${item}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n if (criteria.nonFunctionalRequirements && criteria.nonFunctionalRequirements.length > 0) {\r\n sections.push('**Non-Functional Requirements:**');\r\n for (const req of criteria.nonFunctionalRequirements) {\r\n sections.push(`- ${req}`);\r\n }\r\n sections.push('');\r\n }\r\n\r\n return sections.join('\\n');\r\n}\r\n\r\n/**\r\n * Format iteration context\r\n */\r\nfunction formatIterationContext(iteration?: number, taskId?: string): string {\r\n if (!iteration || iteration === 1) {\r\n return '';\r\n }\r\n\r\n return `\r\n## Current Iteration\r\n\r\nThis is **iteration ${iteration}** of your task.\r\n\r\n**Previous Iterations:**\r\nYou have completed ${iteration - 1} iteration${iteration > 2 ? 's' : ''} before this one.\r\n\r\n**Your Goal:**\r\nAddress feedback from previous iterations and improve the quality of your work.\r\n\r\n**Feedback Access:**\r\nCheck Redis for iteration feedback:\r\n\\`\\`\\`bash\r\nredis-cli get \"swarm:${taskId}:\\${AGENT_ID}:feedback:iteration-${iteration}\"\r\n\\`\\`\\`\r\n\r\n`;\r\n}\r\n\r\n/**\r\n * Build comprehensive system prompt for CLI agent\r\n *\r\n * Combines:\r\n * - Project rules (CLAUDE.md)\r\n * - Agent markdown template\r\n * - Epic context (formatted)\r\n * - Phase context (formatted)\r\n * - Success criteria (formatted)\r\n * - Iteration context\r\n */\r\nexport async function buildCLIAgentSystemPrompt(options: ContextBuilderOptions): Promise<string> {\r\n console.log('[cli-agent-context] Building system prompt...');\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Load and include CLAUDE.md\r\n console.log('[cli-agent-context] Loading CLAUDE.md...');\r\n const projectRules = await loadProjectRules();\r\n if (projectRules) {\r\n sections.push('# Project Rules (CLAUDE.md)');\r\n sections.push('');\r\n sections.push(projectRules);\r\n sections.push('');\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 2. Load and include agent markdown template\r\n console.log(`[cli-agent-context] Loading agent template: ${options.agentType}`);\r\n const agentTemplate = await loadAgentTemplate(options.agentType);\r\n if (agentTemplate) {\r\n sections.push(`# Agent Definition: ${options.agentType}`);\r\n sections.push('');\r\n sections.push(agentTemplate);\r\n sections.push('');\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 3. Parse and format epic context\r\n const epicContext = parseJSON<EpicContext>(options.epicContext, {});\r\n const formattedEpic = formatEpicContext(epicContext);\r\n if (formattedEpic) {\r\n sections.push(formattedEpic);\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 4. Parse and format phase context\r\n const phaseContext = parseJSON<PhaseContext>(options.phaseContext, {});\r\n const formattedPhase = formatPhaseContext(phaseContext);\r\n if (formattedPhase) {\r\n sections.push(formattedPhase);\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 5. Parse and format success criteria\r\n const successCriteria = parseJSON<SuccessCriteria>(options.successCriteria, {});\r\n const formattedCriteria = formatSuccessCriteria(successCriteria);\r\n if (formattedCriteria) {\r\n sections.push(formattedCriteria);\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 6. Format iteration context\r\n const iterationContext = formatIterationContext(options.iteration, options.taskId);\r\n if (iterationContext) {\r\n sections.push(iterationContext);\r\n sections.push('---');\r\n sections.push('');\r\n }\r\n\r\n // 7. Add execution reminder\r\n sections.push('## Execution Instructions');\r\n sections.push('');\r\n sections.push('You are executing as a CLI-spawned agent with full project context.');\r\n sections.push('Follow the agent definition, project rules, and success criteria exactly.');\r\n sections.push('');\r\n sections.push('**Remember:**');\r\n sections.push('- Respect scope boundaries (in-scope vs out-of-scope)');\r\n sections.push('- Meet acceptance criteria and quality gates');\r\n sections.push('- Follow CFN Loop protocol if task-id is provided');\r\n sections.push('- Report confidence score when complete');\r\n sections.push('');\r\n\r\n const fullPrompt = sections.join('\\n');\r\n\r\n console.log(`[cli-agent-context] System prompt built: ${fullPrompt.length} characters`);\r\n console.log(`[cli-agent-context] - Project rules: ${projectRules ? 'included' : 'not found'}`);\r\n console.log(`[cli-agent-context] - Agent template: ${agentTemplate ? 'included' : 'not found'}`);\r\n console.log(`[cli-agent-context] - Epic context: ${formattedEpic ? 'formatted' : 'none'}`);\r\n console.log(`[cli-agent-context] - Phase context: ${formattedPhase ? 'formatted' : 'none'}`);\r\n console.log(`[cli-agent-context] - Success criteria: ${formattedCriteria ? 'formatted' : 'none'}`);\r\n\r\n return fullPrompt;\r\n}\r\n\r\n/**\r\n * Helper: Load context from environment variables\r\n *\r\n * Used by agent executor to load context from env vars set by cfn-spawn\r\n */\r\nexport function loadContextFromEnv(): ContextBuilderOptions {\r\n return {\r\n agentType: process.env.AGENT_TYPE || 'unknown',\r\n taskId: process.env.TASK_ID,\r\n iteration: process.env.ITERATION ? parseInt(process.env.ITERATION, 10) : 1,\r\n epicContext: process.env.EPIC_CONTEXT,\r\n phaseContext: process.env.PHASE_CONTEXT,\r\n successCriteria: process.env.SUCCESS_CRITERIA,\r\n };\r\n}\r\n"],"names":["fs","path","loadProjectRules","cwdPath","join","process","cwd","content","readFile","error","console","warn","loadAgentTemplate","agentType","searchPaths","searchPath","parseJSON","jsonString","fallback","trim","JSON","parse","formatEpicContext","epic","epicGoal","inScope","outOfScope","sections","push","riskProfile","length","item","phases","i","stakeholders","timeline","start","end","milestones","milestone","phase","date","formatPhaseContext","currentPhase","deliverables","phaseNumber","dependencies","dep","deliverable","blockers","blocker","resources","agentCount","estimatedDuration","costBudget","toFixed","formatSuccessCriteria","criteria","acceptanceCriteria","gateThreshold","consensusThreshold","qualityGates","definitionOfDone","nonFunctionalRequirements","criterion","testCoverage","securityScore","performanceBudget","req","formatIterationContext","iteration","taskId","buildCLIAgentSystemPrompt","options","log","projectRules","agentTemplate","epicContext","formattedEpic","phaseContext","formattedPhase","successCriteria","formattedCriteria","iterationContext","fullPrompt","loadContextFromEnv","env","AGENT_TYPE","TASK_ID","ITERATION","parseInt","EPIC_CONTEXT","PHASE_CONTEXT","SUCCESS_CRITERIA"],"mappings":"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"}
|