@weavelogic/knowledge-graph-agent 0.11.8 → 0.12.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.
Files changed (40) hide show
  1. package/dist/claude/hook-capture.d.ts +1 -0
  2. package/dist/claude/hook-capture.d.ts.map +1 -1
  3. package/dist/claude/hook-capture.js +24 -8
  4. package/dist/claude/hook-capture.js.map +1 -1
  5. package/dist/cli/commands/sparc.d.ts +14 -0
  6. package/dist/cli/commands/sparc.d.ts.map +1 -0
  7. package/dist/cli/commands/sparc.js +262 -0
  8. package/dist/cli/commands/sparc.js.map +1 -0
  9. package/dist/cli/index.d.ts.map +1 -1
  10. package/dist/cli/index.js +7 -1
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +12 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/node_modules/@typescript-eslint/project-service/dist/index.js +1 -1
  17. package/dist/node_modules/tinyglobby/dist/index.js +1 -1
  18. package/dist/sparc/consensus.d.ts +149 -0
  19. package/dist/sparc/consensus.d.ts.map +1 -0
  20. package/dist/sparc/consensus.js +356 -0
  21. package/dist/sparc/consensus.js.map +1 -0
  22. package/dist/sparc/decision-log.d.ts +131 -0
  23. package/dist/sparc/decision-log.d.ts.map +1 -0
  24. package/dist/sparc/decision-log.js +325 -0
  25. package/dist/sparc/decision-log.js.map +1 -0
  26. package/dist/sparc/index.d.ts +14 -0
  27. package/dist/sparc/index.d.ts.map +1 -0
  28. package/dist/sparc/index.js +15 -0
  29. package/dist/sparc/index.js.map +1 -0
  30. package/dist/sparc/review-process.d.ts +72 -0
  31. package/dist/sparc/review-process.d.ts.map +1 -0
  32. package/dist/sparc/review-process.js +609 -0
  33. package/dist/sparc/review-process.js.map +1 -0
  34. package/dist/sparc/sparc-planner.d.ts +144 -0
  35. package/dist/sparc/sparc-planner.d.ts.map +1 -0
  36. package/dist/sparc/sparc-planner.js +757 -0
  37. package/dist/sparc/sparc-planner.js.map +1 -0
  38. package/dist/sparc/types.d.ts +664 -0
  39. package/dist/sparc/types.d.ts.map +1 -0
  40. package/package.json +1 -1
@@ -203,6 +203,7 @@ export declare class HookCaptureSystem {
203
203
  export declare function processHookEvent(projectRoot: string, eventType: HookEventType, config?: Partial<CaptureConfig>): Promise<void>;
204
204
  /**
205
205
  * Generate Claude Code hook configuration
206
+ * Uses the new nested format with hooks array required by Claude Code
206
207
  */
207
208
  export declare function generateHookConfig(projectRoot: string): Record<string, unknown>;
208
209
  export default HookCaptureSystem;
@@ -1 +1 @@
1
- {"version":3,"file":"hook-capture.d.ts","sourceRoot":"","sources":["../../src/claude/hook-capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-capture.d.ts","sourceRoot":"","sources":["../../src/claude/hook-capture.ts"],"names":[],"mappings":"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"}
@@ -757,26 +757,42 @@ function generateHookConfig(projectRoot) {
757
757
  hooks: {
758
758
  UserPromptSubmit: [
759
759
  {
760
- type: "command",
761
- command: `${kgBinPath} hooks capture --event UserPromptSubmit --path "${projectRoot}"`
760
+ hooks: [
761
+ {
762
+ type: "command",
763
+ command: `${kgBinPath} hooks capture --event UserPromptSubmit --path "${projectRoot}"`
764
+ }
765
+ ]
762
766
  }
763
767
  ],
764
768
  PreToolUse: [
765
769
  {
766
- type: "command",
767
- command: `${kgBinPath} hooks capture --event PreToolUse --path "${projectRoot}"`
770
+ hooks: [
771
+ {
772
+ type: "command",
773
+ command: `${kgBinPath} hooks capture --event PreToolUse --path "${projectRoot}"`
774
+ }
775
+ ]
768
776
  }
769
777
  ],
770
778
  PostToolUse: [
771
779
  {
772
- type: "command",
773
- command: `${kgBinPath} hooks capture --event PostToolUse --path "${projectRoot}"`
780
+ hooks: [
781
+ {
782
+ type: "command",
783
+ command: `${kgBinPath} hooks capture --event PostToolUse --path "${projectRoot}"`
784
+ }
785
+ ]
774
786
  }
775
787
  ],
776
788
  Stop: [
777
789
  {
778
- type: "command",
779
- command: `${kgBinPath} hooks capture --event Stop --path "${projectRoot}"`
790
+ hooks: [
791
+ {
792
+ type: "command",
793
+ command: `${kgBinPath} hooks capture --event Stop --path "${projectRoot}"`
794
+ }
795
+ ]
780
796
  }
781
797
  ]
782
798
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hook-capture.js","sources":["../../src/claude/hook-capture.ts"],"sourcesContent":["/**\n * Hook Capture System\n *\n * Captures all Claude interactions (prompts, responses, tool calls)\n * and stores them in the knowledge graph with hierarchical structure.\n *\n * @module claude/hook-capture\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport {\n SessionId,\n ConversationId,\n MessageId,\n ToolCallId,\n SubAgentId,\n SwarmId,\n WorkflowId,\n ClaudeSession,\n ClaudeConversation,\n ClaudeMessage,\n ClaudeToolCall,\n ClaudeSubAgent,\n ClaudeSwarm,\n TokenUsage,\n AggregatedTokenUsage,\n ExecutionStatus,\n ClaudeAgentType,\n ToolCategory,\n SwarmTopology,\n SwarmStrategy,\n TextContentBlock,\n BaseMetadata,\n SessionEnvironment,\n createSessionId,\n createConversationId,\n createMessageId,\n createToolCallId,\n createSubAgentId,\n createSwarmId,\n} from './types.js';\n\n/**\n * Hook event types from Claude Code\n */\nexport type HookEventType =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'UserPromptSubmit'\n | 'Stop'\n | 'PreCompact';\n\n/**\n * Raw hook event data received from Claude Code\n */\nexport interface HookEventData {\n event: HookEventType;\n timestamp: string;\n sessionId?: string;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n toolOutput?: string;\n userPrompt?: string;\n exitCode?: number;\n duration?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture configuration options\n */\nexport interface CaptureConfig {\n /** Base directory for storing captured data */\n storageDir: string;\n /** Whether to store in knowledge graph format */\n useKnowledgeGraph: boolean;\n /** Whether to create markdown documents */\n createMarkdown: boolean;\n /** Whether to track tool outputs separately */\n separateToolOutputs: boolean;\n /** Maximum content length to store (truncates if exceeded) */\n maxContentLength: number;\n /** Whether to capture sub-agent spawns */\n captureSubAgents: boolean;\n /** Whether to capture swarm operations */\n captureSwarms: boolean;\n /** Whether to capture workflow executions */\n captureWorkflows: boolean;\n /** Tags to add to all captured items */\n defaultTags: string[];\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CAPTURE_CONFIG: CaptureConfig = {\n storageDir: '.kg/claude',\n useKnowledgeGraph: true,\n createMarkdown: true,\n separateToolOutputs: true,\n maxContentLength: 50000,\n captureSubAgents: true,\n captureSwarms: true,\n captureWorkflows: true,\n defaultTags: ['claude', 'interaction'],\n};\n\n/**\n * In-memory storage for active session data\n */\ninterface StoredSession {\n session: ClaudeSession;\n conversations: Map<ConversationId, ClaudeConversation>;\n messages: Map<MessageId, ClaudeMessage>;\n toolCalls: Map<ToolCallId, ClaudeToolCall>;\n subAgents: Map<SubAgentId, ClaudeSubAgent>;\n swarms: Map<SwarmId, ClaudeSwarm>;\n}\n\n/**\n * Active session state\n */\ninterface CaptureState {\n currentSessionId: SessionId | null;\n currentConversationId: ConversationId | null;\n pendingToolCalls: Map<string, ToolCallId>;\n subAgentStack: SubAgentId[];\n activeSwarmId: SwarmId | null;\n storage: StoredSession | null;\n}\n\n/**\n * Hook Capture System\n *\n * Manages the capture and storage of all Claude interactions.\n */\nexport class HookCaptureSystem {\n private config: CaptureConfig;\n private state: CaptureState;\n private projectRoot: string;\n\n constructor(projectRoot: string, config: Partial<CaptureConfig> = {}) {\n this.projectRoot = projectRoot;\n this.config = { ...DEFAULT_CAPTURE_CONFIG, ...config };\n this.state = {\n currentSessionId: null,\n currentConversationId: null,\n pendingToolCalls: new Map(),\n subAgentStack: [],\n activeSwarmId: null,\n storage: null,\n };\n\n this.ensureStorageDir();\n }\n\n /**\n * Ensure storage directory exists\n */\n private ensureStorageDir(): void {\n const fullPath = join(this.projectRoot, this.config.storageDir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n\n /**\n * Create empty token usage\n */\n private createEmptyTokenUsage(): TokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n }\n\n /**\n * Create empty aggregated token usage\n */\n private createEmptyAggregatedTokenUsage(): AggregatedTokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n operationCount: 0,\n };\n }\n\n /**\n * Create base metadata\n */\n private createBaseMetadata(tags: string[] = []): BaseMetadata {\n const now = new Date();\n return {\n createdAt: now,\n updatedAt: now,\n tags: [...this.config.defaultTags, ...tags],\n };\n }\n\n /**\n * Get current git branch\n */\n private getGitBranch(): string | undefined {\n try {\n const headPath = join(this.projectRoot, '.git', 'HEAD');\n if (existsSync(headPath)) {\n const content = readFileSync(headPath, 'utf-8').trim();\n if (content.startsWith('ref: refs/heads/')) {\n return content.replace('ref: refs/heads/', '');\n }\n }\n } catch {\n // Ignore errors\n }\n return undefined;\n }\n\n /**\n * Start a new session\n */\n startSession(name?: string, purpose?: string): ClaudeSession {\n const sessionId = createSessionId();\n const now = new Date();\n\n const environment: SessionEnvironment = {\n workingDirectory: this.projectRoot,\n gitBranch: this.getGitBranch(),\n platform: process.platform,\n };\n\n const session: ClaudeSession = {\n id: sessionId,\n name: name || `Session ${now.toISOString().slice(0, 16)}`,\n purpose: purpose || 'General interaction',\n startedAt: now,\n status: 'running',\n conversationIds: [],\n swarmIds: [],\n workflowIds: [],\n environment,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['session']),\n };\n\n // Initialize storage\n this.state.storage = {\n session,\n conversations: new Map(),\n messages: new Map(),\n toolCalls: new Map(),\n subAgents: new Map(),\n swarms: new Map(),\n };\n\n this.state.currentSessionId = sessionId;\n this.saveSession(session);\n\n return session;\n }\n\n /**\n * End the current session\n */\n endSession(): ClaudeSession | null {\n if (!this.state.storage) return null;\n\n const session = this.state.storage.session;\n session.endedAt = new Date();\n session.status = 'completed';\n session.metadata.updatedAt = new Date();\n\n // Aggregate token usage from all conversations\n this.aggregateSessionTokens();\n\n this.saveSession(session);\n const result = { ...session };\n\n // Reset state\n this.state.currentSessionId = null;\n this.state.currentConversationId = null;\n this.state.storage = null;\n\n return result;\n }\n\n /**\n * Start a new conversation\n */\n startConversation(model?: string, systemPrompt?: string): ClaudeConversation {\n if (!this.state.storage) {\n this.startSession();\n }\n\n const conversationId = createConversationId();\n const now = new Date();\n\n const conversation: ClaudeConversation = {\n id: conversationId,\n sessionId: this.state.storage!.session.id,\n model: model || 'claude-opus-4-5-20251101',\n systemPrompt,\n messageIds: [],\n subAgentIds: [],\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['conversation']),\n };\n\n this.state.storage!.conversations.set(conversationId, conversation);\n this.state.storage!.session.conversationIds.push(conversationId);\n this.state.currentConversationId = conversationId;\n\n return conversation;\n }\n\n /**\n * Handle hook events\n */\n handleHookEvent(event: HookEventData): void {\n switch (event.event) {\n case 'UserPromptSubmit':\n this.handleUserPrompt(event);\n break;\n case 'PreToolUse':\n this.handlePreToolUse(event);\n break;\n case 'PostToolUse':\n this.handlePostToolUse(event);\n break;\n case 'Stop':\n this.handleSessionStop(event);\n break;\n case 'PreCompact':\n this.handlePreCompact(event);\n break;\n }\n }\n\n /**\n * Handle user prompt submission\n */\n private handleUserPrompt(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const messageId = createMessageId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n const textBlock: TextContentBlock = {\n type: 'text',\n text: this.truncateContent(event.userPrompt || ''),\n };\n\n const message: ClaudeMessage = {\n id: messageId,\n conversationId,\n role: 'user',\n content: textBlock.text,\n contentBlocks: [textBlock],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['prompt', 'user']),\n };\n\n this.state.storage!.messages.set(messageId, message);\n\n const conversation = this.state.storage!.conversations.get(conversationId);\n if (conversation) {\n conversation.messageIds.push(messageId);\n }\n\n this.saveMessage(message);\n }\n\n /**\n * Handle pre-tool use event\n */\n private handlePreToolUse(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const toolCallId = createToolCallId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n // Get or create assistant message\n let lastMessageId: MessageId | undefined;\n const conversation = this.state.storage!.conversations.get(conversationId);\n\n if (conversation && conversation.messageIds.length > 0) {\n lastMessageId = conversation.messageIds[conversation.messageIds.length - 1];\n const lastMessage = this.state.storage!.messages.get(lastMessageId);\n\n if (!lastMessage || lastMessage.role === 'user') {\n // Create new assistant message\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n conversation.messageIds.push(assistantMsgId);\n lastMessageId = assistantMsgId;\n }\n } else {\n // Create new assistant message if no conversation exists\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n if (conversation) {\n conversation.messageIds.push(assistantMsgId);\n }\n lastMessageId = assistantMsgId;\n }\n\n const toolCall: ClaudeToolCall = {\n id: toolCallId,\n messageId: lastMessageId!,\n toolName: event.toolName || 'unknown',\n toolCategory: this.categorizeToolCall(event.toolName || ''),\n input: event.toolInput || {},\n status: 'running',\n startedAt: now,\n metadata: this.createBaseMetadata(['tool-call', event.toolName || 'unknown']),\n };\n\n this.state.storage!.toolCalls.set(toolCallId, toolCall);\n\n // Add to message's tool call list\n const message = this.state.storage!.messages.get(lastMessageId!);\n if (message) {\n message.toolCallIds = message.toolCallIds || [];\n message.toolCallIds.push(toolCallId);\n }\n\n // Track pending tool call by name for matching\n this.state.pendingToolCalls.set(event.toolName || 'unknown', toolCallId);\n\n // Check if this is a Task (sub-agent spawn)\n if (event.toolName === 'Task' && this.config.captureSubAgents) {\n this.handleSubAgentSpawn(event, toolCall);\n }\n\n // Check if this is a swarm operation\n if (event.toolName?.includes('swarm') && this.config.captureSwarms) {\n this.handleSwarmOperation(event, toolCall);\n }\n }\n\n /**\n * Handle post-tool use event\n */\n private handlePostToolUse(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const now = new Date();\n\n // Find the pending tool call\n const toolCallId = this.state.pendingToolCalls.get(event.toolName || 'unknown');\n if (!toolCallId) return;\n\n this.state.pendingToolCalls.delete(event.toolName || 'unknown');\n\n const toolCall = this.state.storage.toolCalls.get(toolCallId);\n if (!toolCall) return;\n\n toolCall.output = this.truncateContent(event.toolOutput || '');\n toolCall.completedAt = now;\n toolCall.status = event.error ? 'failed' : 'completed';\n toolCall.executionTimeMs = event.duration;\n if (event.error) {\n toolCall.error = {\n type: 'execution_error',\n message: event.error,\n };\n }\n toolCall.metadata.updatedAt = now;\n\n // Track affected files for file operations\n if (toolCall.toolCategory === 'file') {\n const input = toolCall.input as Record<string, unknown>;\n const filePath = input.file_path || input.path;\n if (filePath) {\n toolCall.affectedFiles = [String(filePath)];\n }\n }\n\n // Handle sub-agent completion\n if (event.toolName === 'Task' && this.state.subAgentStack.length > 0) {\n this.handleSubAgentComplete(event);\n }\n\n this.saveToolCall(toolCall);\n }\n\n /**\n * Handle session stop event\n */\n private handleSessionStop(_event: HookEventData): void {\n this.endSession();\n }\n\n /**\n * Handle pre-compact event\n */\n private handlePreCompact(_event: HookEventData): void {\n // Save current state before compaction\n if (this.state.storage) {\n this.state.storage.session.metadata.custom = {\n ...this.state.storage.session.metadata.custom,\n lastCompaction: new Date().toISOString(),\n };\n this.saveSession(this.state.storage.session);\n }\n }\n\n /**\n * Handle sub-agent spawn\n */\n private handleSubAgentSpawn(event: HookEventData, toolCall: ClaudeToolCall): void {\n if (!this.state.storage || !this.state.currentConversationId) return;\n\n const subAgentId = createSubAgentId();\n const now = new Date();\n\n const input = event.toolInput as Record<string, unknown>;\n const parentConversationId = this.state.currentConversationId;\n const parentMessageId = toolCall.messageId;\n\n const subAgent: ClaudeSubAgent = {\n id: subAgentId,\n parentConversationId,\n parentMessageId,\n toolCallId: toolCall.id,\n agentType: (input.subagent_type as ClaudeAgentType) || 'custom',\n name: String(input.description || 'Sub-agent'),\n task: this.truncateContent(String(input.prompt || input.description || 'Unknown task')),\n model: (input.model as string) || 'claude-sonnet-4-20250514',\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['sub-agent', String(input.subagent_type || 'custom')]),\n };\n\n this.state.storage.subAgents.set(subAgentId, subAgent);\n this.state.subAgentStack.push(subAgentId);\n\n // Add to conversation's sub-agent list\n const conversation = this.state.storage.conversations.get(parentConversationId);\n if (conversation) {\n conversation.subAgentIds = conversation.subAgentIds || [];\n conversation.subAgentIds.push(subAgentId);\n }\n }\n\n /**\n * Handle sub-agent completion\n */\n private handleSubAgentComplete(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const subAgentId = this.state.subAgentStack.pop();\n if (!subAgentId) return;\n\n const subAgent = this.state.storage.subAgents.get(subAgentId);\n if (!subAgent) return;\n\n const now = new Date();\n subAgent.completedAt = now;\n subAgent.status = event.error ? 'failed' : 'completed';\n\n // Parse result\n subAgent.result = {\n success: !event.error,\n summary: this.truncateContent(event.toolOutput || '').slice(0, 500),\n error: event.error,\n };\n\n subAgent.metadata.updatedAt = now;\n this.saveSubAgent(subAgent);\n }\n\n /**\n * Handle swarm operation\n */\n private handleSwarmOperation(event: HookEventData, _toolCall: ClaudeToolCall): void {\n if (!this.state.storage) return;\n\n const input = event.toolInput as Record<string, unknown>;\n\n if (event.toolName?.includes('swarm_init')) {\n const swarmId = createSwarmId();\n const now = new Date();\n\n const swarm: ClaudeSwarm = {\n id: swarmId,\n sessionId: this.state.storage.session.id,\n name: String(input.name || 'Swarm'),\n topology: (input.topology as SwarmTopology) || 'mesh',\n strategy: (input.strategy as SwarmStrategy) || 'adaptive',\n maxAgents: (input.maxAgents as number) || 8,\n agentIds: [],\n task: String(input.task || 'Swarm task'),\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['swarm']),\n };\n\n this.state.storage.swarms.set(swarmId, swarm);\n this.state.storage.session.swarmIds = this.state.storage.session.swarmIds || [];\n this.state.storage.session.swarmIds.push(swarmId);\n this.state.activeSwarmId = swarmId;\n }\n }\n\n /**\n * Categorize tool calls\n */\n private categorizeToolCall(toolName: string): ToolCategory {\n const categories: Record<string, ToolCategory> = {\n Read: 'file',\n Write: 'file',\n Edit: 'file',\n MultiEdit: 'file',\n Glob: 'file',\n Grep: 'file',\n Bash: 'bash',\n Task: 'task',\n WebFetch: 'search',\n WebSearch: 'search',\n TodoWrite: 'todo',\n NotebookEdit: 'notebook',\n Skill: 'skill',\n };\n\n if (toolName.startsWith('mcp__')) {\n return 'mcp';\n }\n\n return categories[toolName] || 'other';\n }\n\n /**\n * Aggregate session tokens\n */\n private aggregateSessionTokens(): void {\n if (!this.state.storage) return;\n\n let totalInput = 0;\n let totalOutput = 0;\n let operationCount = 0;\n\n for (const conversation of this.state.storage.conversations.values()) {\n totalInput += conversation.tokenUsage.inputTokens;\n totalOutput += conversation.tokenUsage.outputTokens;\n operationCount++;\n }\n\n this.state.storage.session.tokenUsage = {\n inputTokens: totalInput,\n outputTokens: totalOutput,\n totalTokens: totalInput + totalOutput,\n operationCount,\n };\n }\n\n /**\n * Truncate content to max length\n */\n private truncateContent(content: string): string {\n if (content.length <= this.config.maxContentLength) {\n return content;\n }\n return content.slice(0, this.config.maxContentLength) + '\\n\\n[... truncated ...]';\n }\n\n /**\n * Get storage path for an entity\n */\n private getStoragePath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.json`);\n }\n\n /**\n * Get markdown path for an entity\n */\n private getMarkdownPath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, 'docs', type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.md`);\n }\n\n /**\n * Save session to storage\n */\n private saveSession(session: ClaudeSession): void {\n const path = this.getStoragePath('sessions', session.id);\n writeFileSync(path, JSON.stringify(session, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSessionMarkdown(session);\n }\n }\n\n /**\n * Save session as markdown\n */\n private saveSessionMarkdown(session: ClaudeSession): void {\n const path = this.getMarkdownPath('sessions', session.id);\n\n const content = `---\ntitle: \"${session.name}\"\ntype: claude-session\nstatus: ${session.status}\ncreated: ${session.startedAt.toISOString()}\nupdated: ${session.metadata.updatedAt.toISOString()}\ntags: [${session.metadata.tags.join(', ')}]\nsession_id: \"${session.id}\"\n---\n\n# ${session.name}\n\n**Purpose:** ${session.purpose || 'General interaction'}\n\n**Started:** ${session.startedAt.toISOString()}\n${session.endedAt ? `**Ended:** ${session.endedAt.toISOString()}` : '**Status:** In Progress'}\n\n## Environment\n\n- **Working Directory:** ${session.environment?.workingDirectory || 'Unknown'}\n${session.environment?.gitBranch ? `- **Git Branch:** ${session.environment.gitBranch}` : ''}\n\n## Conversations\n\n${session.conversationIds.map(id => `- [[${id}]]`).join('\\n') || 'No conversations yet'}\n\n## Token Usage\n\n| Metric | Count |\n|--------|-------|\n| Input Tokens | ${session.tokenUsage.inputTokens} |\n| Output Tokens | ${session.tokenUsage.outputTokens} |\n| Total Tokens | ${session.tokenUsage.totalTokens} |\n| Operations | ${session.tokenUsage.operationCount} |\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Save message to storage\n */\n private saveMessage(message: ClaudeMessage): void {\n if (this.config.createMarkdown) {\n this.appendToConversationLog(message);\n }\n }\n\n /**\n * Append message to conversation log\n */\n private appendToConversationLog(message: ClaudeMessage): void {\n const path = this.getMarkdownPath('conversations', message.conversationId);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Initialize file with header if new\n if (!existsSync(path)) {\n const header = `---\ntitle: \"Conversation ${message.conversationId}\"\ntype: claude-conversation\ncreated: ${message.timestamp.toISOString()}\ntags: [${this.config.defaultTags.join(', ')}]\n---\n\n# Conversation Log\n\n`;\n writeFileSync(path, header);\n }\n\n const roleIcon = message.role === 'user' ? '👤' : '🤖';\n\n const entry = `\n## ${roleIcon} ${message.role.charAt(0).toUpperCase() + message.role.slice(1)} - ${message.timestamp.toISOString()}\n\n${message.content}\n\n${message.toolCallIds && message.toolCallIds.length > 0 ? `**Tool Calls:** ${message.toolCallIds.join(', ')}` : ''}\n\n---\n`;\n\n appendFileSync(path, entry);\n }\n\n /**\n * Save tool call to storage\n */\n private saveToolCall(toolCall: ClaudeToolCall): void {\n if (this.config.separateToolOutputs && toolCall.output) {\n const path = this.getStoragePath('tool-outputs', toolCall.id);\n writeFileSync(\n path,\n JSON.stringify(\n {\n id: toolCall.id,\n name: toolCall.toolName,\n category: toolCall.toolCategory,\n input: toolCall.input,\n output: toolCall.output,\n status: toolCall.status,\n executionTimeMs: toolCall.executionTimeMs,\n affectedFiles: toolCall.affectedFiles,\n timestamp: toolCall.completedAt?.toISOString(),\n },\n null,\n 2\n )\n );\n }\n }\n\n /**\n * Save sub-agent to storage\n */\n private saveSubAgent(subAgent: ClaudeSubAgent): void {\n const path = this.getStoragePath('agents', subAgent.id);\n writeFileSync(path, JSON.stringify(subAgent, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSubAgentMarkdown(subAgent);\n }\n }\n\n /**\n * Save sub-agent as markdown\n */\n private saveSubAgentMarkdown(subAgent: ClaudeSubAgent): void {\n const path = this.getMarkdownPath('agents', subAgent.id);\n\n const content = `---\ntitle: \"Sub-Agent: ${subAgent.name.slice(0, 50)}\"\ntype: claude-agent\nstatus: ${subAgent.status}\nagent_type: ${subAgent.agentType}\ncreated: ${subAgent.startedAt.toISOString()}\ntags: [${subAgent.metadata.tags.join(', ')}]\n---\n\n# Sub-Agent: ${subAgent.agentType}\n\n**Name:** ${subAgent.name}\n**Task:** ${subAgent.task.slice(0, 200)}${subAgent.task.length > 200 ? '...' : ''}\n\n**Status:** ${subAgent.status}\n**Model:** ${subAgent.model}\n**Spawned:** ${subAgent.startedAt.toISOString()}\n${subAgent.completedAt ? `**Completed:** ${subAgent.completedAt.toISOString()}` : ''}\n\n## Task Description\n\n\\`\\`\\`\n${subAgent.task}\n\\`\\`\\`\n\n${\n subAgent.result\n ? `\n## Result\n\n**Success:** ${subAgent.result.success}\n\n${subAgent.result.summary ? `### Summary\\n${subAgent.result.summary}` : ''}\n\n${subAgent.result.error ? `### Error\\n\\`\\`\\`\\n${subAgent.result.error}\\n\\`\\`\\`` : ''}\n`\n : ''\n}\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Get current session\n */\n getCurrentSession(): ClaudeSession | null {\n return this.state.storage?.session || null;\n }\n\n /**\n * Get current conversation\n */\n getCurrentConversation(): ClaudeConversation | null {\n if (!this.state.storage || !this.state.currentConversationId) return null;\n return this.state.storage.conversations.get(this.state.currentConversationId) || null;\n }\n\n /**\n * Load session from storage\n */\n loadSession(sessionId: SessionId): ClaudeSession | null {\n const path = this.getStoragePath('sessions', sessionId);\n if (!existsSync(path)) return null;\n\n try {\n const data = readFileSync(path, 'utf-8');\n return JSON.parse(data) as ClaudeSession;\n } catch {\n return null;\n }\n }\n\n /**\n * List all stored sessions\n */\n listSessions(): SessionId[] {\n const sessionsDir = join(this.projectRoot, this.config.storageDir, 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n try {\n const { readdirSync } = require('fs');\n const files = readdirSync(sessionsDir) as string[];\n return files\n .filter((f: string) => f.endsWith('.json'))\n .map((f: string) => f.replace('.json', '') as SessionId);\n } catch {\n return [];\n }\n }\n}\n\n/**\n * Process hook event from stdin (for use as CLI hook)\n */\nexport async function processHookEvent(\n projectRoot: string,\n eventType: HookEventType,\n config?: Partial<CaptureConfig>\n): Promise<void> {\n const capture = new HookCaptureSystem(projectRoot, config);\n\n // Read event data from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const inputData = Buffer.concat(chunks).toString('utf-8');\n\n let eventData: HookEventData;\n\n try {\n const parsed = JSON.parse(inputData);\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n toolName: parsed.tool_name || process.env.TOOL_NAME,\n toolInput: parsed.tool_input,\n toolOutput: parsed.tool_output,\n userPrompt: parsed.user_prompt || inputData,\n metadata: parsed,\n };\n } catch {\n // Plain text input (e.g., user prompt)\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n userPrompt: inputData,\n };\n }\n\n capture.handleHookEvent(eventData);\n}\n\n/**\n * Generate Claude Code hook configuration\n */\nexport function generateHookConfig(projectRoot: string): Record<string, unknown> {\n const kgBinPath = 'npx @weavelogic/knowledge-graph-agent';\n\n return {\n hooks: {\n UserPromptSubmit: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event UserPromptSubmit --path \"${projectRoot}\"`,\n },\n ],\n PreToolUse: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PreToolUse --path \"${projectRoot}\"`,\n },\n ],\n PostToolUse: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PostToolUse --path \"${projectRoot}\"`,\n },\n ],\n Stop: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event Stop --path \"${projectRoot}\"`,\n },\n ],\n },\n };\n}\n\nexport default HookCaptureSystem;\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-capture.js","sources":["../../src/claude/hook-capture.ts"],"sourcesContent":["/**\n * Hook Capture System\n *\n * Captures all Claude interactions (prompts, responses, tool calls)\n * and stores them in the knowledge graph with hierarchical structure.\n *\n * @module claude/hook-capture\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, appendFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport {\n SessionId,\n ConversationId,\n MessageId,\n ToolCallId,\n SubAgentId,\n SwarmId,\n WorkflowId,\n ClaudeSession,\n ClaudeConversation,\n ClaudeMessage,\n ClaudeToolCall,\n ClaudeSubAgent,\n ClaudeSwarm,\n TokenUsage,\n AggregatedTokenUsage,\n ExecutionStatus,\n ClaudeAgentType,\n ToolCategory,\n SwarmTopology,\n SwarmStrategy,\n TextContentBlock,\n BaseMetadata,\n SessionEnvironment,\n createSessionId,\n createConversationId,\n createMessageId,\n createToolCallId,\n createSubAgentId,\n createSwarmId,\n} from './types.js';\n\n/**\n * Hook event types from Claude Code\n */\nexport type HookEventType =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'UserPromptSubmit'\n | 'Stop'\n | 'PreCompact';\n\n/**\n * Raw hook event data received from Claude Code\n */\nexport interface HookEventData {\n event: HookEventType;\n timestamp: string;\n sessionId?: string;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n toolOutput?: string;\n userPrompt?: string;\n exitCode?: number;\n duration?: number;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture configuration options\n */\nexport interface CaptureConfig {\n /** Base directory for storing captured data */\n storageDir: string;\n /** Whether to store in knowledge graph format */\n useKnowledgeGraph: boolean;\n /** Whether to create markdown documents */\n createMarkdown: boolean;\n /** Whether to track tool outputs separately */\n separateToolOutputs: boolean;\n /** Maximum content length to store (truncates if exceeded) */\n maxContentLength: number;\n /** Whether to capture sub-agent spawns */\n captureSubAgents: boolean;\n /** Whether to capture swarm operations */\n captureSwarms: boolean;\n /** Whether to capture workflow executions */\n captureWorkflows: boolean;\n /** Tags to add to all captured items */\n defaultTags: string[];\n}\n\n/**\n * Default configuration\n */\nexport const DEFAULT_CAPTURE_CONFIG: CaptureConfig = {\n storageDir: '.kg/claude',\n useKnowledgeGraph: true,\n createMarkdown: true,\n separateToolOutputs: true,\n maxContentLength: 50000,\n captureSubAgents: true,\n captureSwarms: true,\n captureWorkflows: true,\n defaultTags: ['claude', 'interaction'],\n};\n\n/**\n * In-memory storage for active session data\n */\ninterface StoredSession {\n session: ClaudeSession;\n conversations: Map<ConversationId, ClaudeConversation>;\n messages: Map<MessageId, ClaudeMessage>;\n toolCalls: Map<ToolCallId, ClaudeToolCall>;\n subAgents: Map<SubAgentId, ClaudeSubAgent>;\n swarms: Map<SwarmId, ClaudeSwarm>;\n}\n\n/**\n * Active session state\n */\ninterface CaptureState {\n currentSessionId: SessionId | null;\n currentConversationId: ConversationId | null;\n pendingToolCalls: Map<string, ToolCallId>;\n subAgentStack: SubAgentId[];\n activeSwarmId: SwarmId | null;\n storage: StoredSession | null;\n}\n\n/**\n * Hook Capture System\n *\n * Manages the capture and storage of all Claude interactions.\n */\nexport class HookCaptureSystem {\n private config: CaptureConfig;\n private state: CaptureState;\n private projectRoot: string;\n\n constructor(projectRoot: string, config: Partial<CaptureConfig> = {}) {\n this.projectRoot = projectRoot;\n this.config = { ...DEFAULT_CAPTURE_CONFIG, ...config };\n this.state = {\n currentSessionId: null,\n currentConversationId: null,\n pendingToolCalls: new Map(),\n subAgentStack: [],\n activeSwarmId: null,\n storage: null,\n };\n\n this.ensureStorageDir();\n }\n\n /**\n * Ensure storage directory exists\n */\n private ensureStorageDir(): void {\n const fullPath = join(this.projectRoot, this.config.storageDir);\n if (!existsSync(fullPath)) {\n mkdirSync(fullPath, { recursive: true });\n }\n }\n\n /**\n * Create empty token usage\n */\n private createEmptyTokenUsage(): TokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n };\n }\n\n /**\n * Create empty aggregated token usage\n */\n private createEmptyAggregatedTokenUsage(): AggregatedTokenUsage {\n return {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n operationCount: 0,\n };\n }\n\n /**\n * Create base metadata\n */\n private createBaseMetadata(tags: string[] = []): BaseMetadata {\n const now = new Date();\n return {\n createdAt: now,\n updatedAt: now,\n tags: [...this.config.defaultTags, ...tags],\n };\n }\n\n /**\n * Get current git branch\n */\n private getGitBranch(): string | undefined {\n try {\n const headPath = join(this.projectRoot, '.git', 'HEAD');\n if (existsSync(headPath)) {\n const content = readFileSync(headPath, 'utf-8').trim();\n if (content.startsWith('ref: refs/heads/')) {\n return content.replace('ref: refs/heads/', '');\n }\n }\n } catch {\n // Ignore errors\n }\n return undefined;\n }\n\n /**\n * Start a new session\n */\n startSession(name?: string, purpose?: string): ClaudeSession {\n const sessionId = createSessionId();\n const now = new Date();\n\n const environment: SessionEnvironment = {\n workingDirectory: this.projectRoot,\n gitBranch: this.getGitBranch(),\n platform: process.platform,\n };\n\n const session: ClaudeSession = {\n id: sessionId,\n name: name || `Session ${now.toISOString().slice(0, 16)}`,\n purpose: purpose || 'General interaction',\n startedAt: now,\n status: 'running',\n conversationIds: [],\n swarmIds: [],\n workflowIds: [],\n environment,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['session']),\n };\n\n // Initialize storage\n this.state.storage = {\n session,\n conversations: new Map(),\n messages: new Map(),\n toolCalls: new Map(),\n subAgents: new Map(),\n swarms: new Map(),\n };\n\n this.state.currentSessionId = sessionId;\n this.saveSession(session);\n\n return session;\n }\n\n /**\n * End the current session\n */\n endSession(): ClaudeSession | null {\n if (!this.state.storage) return null;\n\n const session = this.state.storage.session;\n session.endedAt = new Date();\n session.status = 'completed';\n session.metadata.updatedAt = new Date();\n\n // Aggregate token usage from all conversations\n this.aggregateSessionTokens();\n\n this.saveSession(session);\n const result = { ...session };\n\n // Reset state\n this.state.currentSessionId = null;\n this.state.currentConversationId = null;\n this.state.storage = null;\n\n return result;\n }\n\n /**\n * Start a new conversation\n */\n startConversation(model?: string, systemPrompt?: string): ClaudeConversation {\n if (!this.state.storage) {\n this.startSession();\n }\n\n const conversationId = createConversationId();\n const now = new Date();\n\n const conversation: ClaudeConversation = {\n id: conversationId,\n sessionId: this.state.storage!.session.id,\n model: model || 'claude-opus-4-5-20251101',\n systemPrompt,\n messageIds: [],\n subAgentIds: [],\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['conversation']),\n };\n\n this.state.storage!.conversations.set(conversationId, conversation);\n this.state.storage!.session.conversationIds.push(conversationId);\n this.state.currentConversationId = conversationId;\n\n return conversation;\n }\n\n /**\n * Handle hook events\n */\n handleHookEvent(event: HookEventData): void {\n switch (event.event) {\n case 'UserPromptSubmit':\n this.handleUserPrompt(event);\n break;\n case 'PreToolUse':\n this.handlePreToolUse(event);\n break;\n case 'PostToolUse':\n this.handlePostToolUse(event);\n break;\n case 'Stop':\n this.handleSessionStop(event);\n break;\n case 'PreCompact':\n this.handlePreCompact(event);\n break;\n }\n }\n\n /**\n * Handle user prompt submission\n */\n private handleUserPrompt(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const messageId = createMessageId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n const textBlock: TextContentBlock = {\n type: 'text',\n text: this.truncateContent(event.userPrompt || ''),\n };\n\n const message: ClaudeMessage = {\n id: messageId,\n conversationId,\n role: 'user',\n content: textBlock.text,\n contentBlocks: [textBlock],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['prompt', 'user']),\n };\n\n this.state.storage!.messages.set(messageId, message);\n\n const conversation = this.state.storage!.conversations.get(conversationId);\n if (conversation) {\n conversation.messageIds.push(messageId);\n }\n\n this.saveMessage(message);\n }\n\n /**\n * Handle pre-tool use event\n */\n private handlePreToolUse(event: HookEventData): void {\n if (!this.state.currentConversationId || !this.state.storage) {\n this.startConversation();\n }\n\n const toolCallId = createToolCallId();\n const now = new Date();\n const conversationId = this.state.currentConversationId!;\n\n // Get or create assistant message\n let lastMessageId: MessageId | undefined;\n const conversation = this.state.storage!.conversations.get(conversationId);\n\n if (conversation && conversation.messageIds.length > 0) {\n lastMessageId = conversation.messageIds[conversation.messageIds.length - 1];\n const lastMessage = this.state.storage!.messages.get(lastMessageId);\n\n if (!lastMessage || lastMessage.role === 'user') {\n // Create new assistant message\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n conversation.messageIds.push(assistantMsgId);\n lastMessageId = assistantMsgId;\n }\n } else {\n // Create new assistant message if no conversation exists\n const assistantMsgId = createMessageId();\n const assistantMessage: ClaudeMessage = {\n id: assistantMsgId,\n conversationId,\n role: 'assistant',\n content: '',\n contentBlocks: [],\n toolCallIds: [],\n timestamp: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['response', 'assistant']),\n };\n this.state.storage!.messages.set(assistantMsgId, assistantMessage);\n if (conversation) {\n conversation.messageIds.push(assistantMsgId);\n }\n lastMessageId = assistantMsgId;\n }\n\n const toolCall: ClaudeToolCall = {\n id: toolCallId,\n messageId: lastMessageId!,\n toolName: event.toolName || 'unknown',\n toolCategory: this.categorizeToolCall(event.toolName || ''),\n input: event.toolInput || {},\n status: 'running',\n startedAt: now,\n metadata: this.createBaseMetadata(['tool-call', event.toolName || 'unknown']),\n };\n\n this.state.storage!.toolCalls.set(toolCallId, toolCall);\n\n // Add to message's tool call list\n const message = this.state.storage!.messages.get(lastMessageId!);\n if (message) {\n message.toolCallIds = message.toolCallIds || [];\n message.toolCallIds.push(toolCallId);\n }\n\n // Track pending tool call by name for matching\n this.state.pendingToolCalls.set(event.toolName || 'unknown', toolCallId);\n\n // Check if this is a Task (sub-agent spawn)\n if (event.toolName === 'Task' && this.config.captureSubAgents) {\n this.handleSubAgentSpawn(event, toolCall);\n }\n\n // Check if this is a swarm operation\n if (event.toolName?.includes('swarm') && this.config.captureSwarms) {\n this.handleSwarmOperation(event, toolCall);\n }\n }\n\n /**\n * Handle post-tool use event\n */\n private handlePostToolUse(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const now = new Date();\n\n // Find the pending tool call\n const toolCallId = this.state.pendingToolCalls.get(event.toolName || 'unknown');\n if (!toolCallId) return;\n\n this.state.pendingToolCalls.delete(event.toolName || 'unknown');\n\n const toolCall = this.state.storage.toolCalls.get(toolCallId);\n if (!toolCall) return;\n\n toolCall.output = this.truncateContent(event.toolOutput || '');\n toolCall.completedAt = now;\n toolCall.status = event.error ? 'failed' : 'completed';\n toolCall.executionTimeMs = event.duration;\n if (event.error) {\n toolCall.error = {\n type: 'execution_error',\n message: event.error,\n };\n }\n toolCall.metadata.updatedAt = now;\n\n // Track affected files for file operations\n if (toolCall.toolCategory === 'file') {\n const input = toolCall.input as Record<string, unknown>;\n const filePath = input.file_path || input.path;\n if (filePath) {\n toolCall.affectedFiles = [String(filePath)];\n }\n }\n\n // Handle sub-agent completion\n if (event.toolName === 'Task' && this.state.subAgentStack.length > 0) {\n this.handleSubAgentComplete(event);\n }\n\n this.saveToolCall(toolCall);\n }\n\n /**\n * Handle session stop event\n */\n private handleSessionStop(_event: HookEventData): void {\n this.endSession();\n }\n\n /**\n * Handle pre-compact event\n */\n private handlePreCompact(_event: HookEventData): void {\n // Save current state before compaction\n if (this.state.storage) {\n this.state.storage.session.metadata.custom = {\n ...this.state.storage.session.metadata.custom,\n lastCompaction: new Date().toISOString(),\n };\n this.saveSession(this.state.storage.session);\n }\n }\n\n /**\n * Handle sub-agent spawn\n */\n private handleSubAgentSpawn(event: HookEventData, toolCall: ClaudeToolCall): void {\n if (!this.state.storage || !this.state.currentConversationId) return;\n\n const subAgentId = createSubAgentId();\n const now = new Date();\n\n const input = event.toolInput as Record<string, unknown>;\n const parentConversationId = this.state.currentConversationId;\n const parentMessageId = toolCall.messageId;\n\n const subAgent: ClaudeSubAgent = {\n id: subAgentId,\n parentConversationId,\n parentMessageId,\n toolCallId: toolCall.id,\n agentType: (input.subagent_type as ClaudeAgentType) || 'custom',\n name: String(input.description || 'Sub-agent'),\n task: this.truncateContent(String(input.prompt || input.description || 'Unknown task')),\n model: (input.model as string) || 'claude-sonnet-4-20250514',\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyTokenUsage(),\n metadata: this.createBaseMetadata(['sub-agent', String(input.subagent_type || 'custom')]),\n };\n\n this.state.storage.subAgents.set(subAgentId, subAgent);\n this.state.subAgentStack.push(subAgentId);\n\n // Add to conversation's sub-agent list\n const conversation = this.state.storage.conversations.get(parentConversationId);\n if (conversation) {\n conversation.subAgentIds = conversation.subAgentIds || [];\n conversation.subAgentIds.push(subAgentId);\n }\n }\n\n /**\n * Handle sub-agent completion\n */\n private handleSubAgentComplete(event: HookEventData): void {\n if (!this.state.storage) return;\n\n const subAgentId = this.state.subAgentStack.pop();\n if (!subAgentId) return;\n\n const subAgent = this.state.storage.subAgents.get(subAgentId);\n if (!subAgent) return;\n\n const now = new Date();\n subAgent.completedAt = now;\n subAgent.status = event.error ? 'failed' : 'completed';\n\n // Parse result\n subAgent.result = {\n success: !event.error,\n summary: this.truncateContent(event.toolOutput || '').slice(0, 500),\n error: event.error,\n };\n\n subAgent.metadata.updatedAt = now;\n this.saveSubAgent(subAgent);\n }\n\n /**\n * Handle swarm operation\n */\n private handleSwarmOperation(event: HookEventData, _toolCall: ClaudeToolCall): void {\n if (!this.state.storage) return;\n\n const input = event.toolInput as Record<string, unknown>;\n\n if (event.toolName?.includes('swarm_init')) {\n const swarmId = createSwarmId();\n const now = new Date();\n\n const swarm: ClaudeSwarm = {\n id: swarmId,\n sessionId: this.state.storage.session.id,\n name: String(input.name || 'Swarm'),\n topology: (input.topology as SwarmTopology) || 'mesh',\n strategy: (input.strategy as SwarmStrategy) || 'adaptive',\n maxAgents: (input.maxAgents as number) || 8,\n agentIds: [],\n task: String(input.task || 'Swarm task'),\n status: 'running',\n startedAt: now,\n tokenUsage: this.createEmptyAggregatedTokenUsage(),\n metadata: this.createBaseMetadata(['swarm']),\n };\n\n this.state.storage.swarms.set(swarmId, swarm);\n this.state.storage.session.swarmIds = this.state.storage.session.swarmIds || [];\n this.state.storage.session.swarmIds.push(swarmId);\n this.state.activeSwarmId = swarmId;\n }\n }\n\n /**\n * Categorize tool calls\n */\n private categorizeToolCall(toolName: string): ToolCategory {\n const categories: Record<string, ToolCategory> = {\n Read: 'file',\n Write: 'file',\n Edit: 'file',\n MultiEdit: 'file',\n Glob: 'file',\n Grep: 'file',\n Bash: 'bash',\n Task: 'task',\n WebFetch: 'search',\n WebSearch: 'search',\n TodoWrite: 'todo',\n NotebookEdit: 'notebook',\n Skill: 'skill',\n };\n\n if (toolName.startsWith('mcp__')) {\n return 'mcp';\n }\n\n return categories[toolName] || 'other';\n }\n\n /**\n * Aggregate session tokens\n */\n private aggregateSessionTokens(): void {\n if (!this.state.storage) return;\n\n let totalInput = 0;\n let totalOutput = 0;\n let operationCount = 0;\n\n for (const conversation of this.state.storage.conversations.values()) {\n totalInput += conversation.tokenUsage.inputTokens;\n totalOutput += conversation.tokenUsage.outputTokens;\n operationCount++;\n }\n\n this.state.storage.session.tokenUsage = {\n inputTokens: totalInput,\n outputTokens: totalOutput,\n totalTokens: totalInput + totalOutput,\n operationCount,\n };\n }\n\n /**\n * Truncate content to max length\n */\n private truncateContent(content: string): string {\n if (content.length <= this.config.maxContentLength) {\n return content;\n }\n return content.slice(0, this.config.maxContentLength) + '\\n\\n[... truncated ...]';\n }\n\n /**\n * Get storage path for an entity\n */\n private getStoragePath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.json`);\n }\n\n /**\n * Get markdown path for an entity\n */\n private getMarkdownPath(type: string, id: string): string {\n const dir = join(this.projectRoot, this.config.storageDir, 'docs', type);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n return join(dir, `${id}.md`);\n }\n\n /**\n * Save session to storage\n */\n private saveSession(session: ClaudeSession): void {\n const path = this.getStoragePath('sessions', session.id);\n writeFileSync(path, JSON.stringify(session, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSessionMarkdown(session);\n }\n }\n\n /**\n * Save session as markdown\n */\n private saveSessionMarkdown(session: ClaudeSession): void {\n const path = this.getMarkdownPath('sessions', session.id);\n\n const content = `---\ntitle: \"${session.name}\"\ntype: claude-session\nstatus: ${session.status}\ncreated: ${session.startedAt.toISOString()}\nupdated: ${session.metadata.updatedAt.toISOString()}\ntags: [${session.metadata.tags.join(', ')}]\nsession_id: \"${session.id}\"\n---\n\n# ${session.name}\n\n**Purpose:** ${session.purpose || 'General interaction'}\n\n**Started:** ${session.startedAt.toISOString()}\n${session.endedAt ? `**Ended:** ${session.endedAt.toISOString()}` : '**Status:** In Progress'}\n\n## Environment\n\n- **Working Directory:** ${session.environment?.workingDirectory || 'Unknown'}\n${session.environment?.gitBranch ? `- **Git Branch:** ${session.environment.gitBranch}` : ''}\n\n## Conversations\n\n${session.conversationIds.map(id => `- [[${id}]]`).join('\\n') || 'No conversations yet'}\n\n## Token Usage\n\n| Metric | Count |\n|--------|-------|\n| Input Tokens | ${session.tokenUsage.inputTokens} |\n| Output Tokens | ${session.tokenUsage.outputTokens} |\n| Total Tokens | ${session.tokenUsage.totalTokens} |\n| Operations | ${session.tokenUsage.operationCount} |\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Save message to storage\n */\n private saveMessage(message: ClaudeMessage): void {\n if (this.config.createMarkdown) {\n this.appendToConversationLog(message);\n }\n }\n\n /**\n * Append message to conversation log\n */\n private appendToConversationLog(message: ClaudeMessage): void {\n const path = this.getMarkdownPath('conversations', message.conversationId);\n const dir = dirname(path);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Initialize file with header if new\n if (!existsSync(path)) {\n const header = `---\ntitle: \"Conversation ${message.conversationId}\"\ntype: claude-conversation\ncreated: ${message.timestamp.toISOString()}\ntags: [${this.config.defaultTags.join(', ')}]\n---\n\n# Conversation Log\n\n`;\n writeFileSync(path, header);\n }\n\n const roleIcon = message.role === 'user' ? '👤' : '🤖';\n\n const entry = `\n## ${roleIcon} ${message.role.charAt(0).toUpperCase() + message.role.slice(1)} - ${message.timestamp.toISOString()}\n\n${message.content}\n\n${message.toolCallIds && message.toolCallIds.length > 0 ? `**Tool Calls:** ${message.toolCallIds.join(', ')}` : ''}\n\n---\n`;\n\n appendFileSync(path, entry);\n }\n\n /**\n * Save tool call to storage\n */\n private saveToolCall(toolCall: ClaudeToolCall): void {\n if (this.config.separateToolOutputs && toolCall.output) {\n const path = this.getStoragePath('tool-outputs', toolCall.id);\n writeFileSync(\n path,\n JSON.stringify(\n {\n id: toolCall.id,\n name: toolCall.toolName,\n category: toolCall.toolCategory,\n input: toolCall.input,\n output: toolCall.output,\n status: toolCall.status,\n executionTimeMs: toolCall.executionTimeMs,\n affectedFiles: toolCall.affectedFiles,\n timestamp: toolCall.completedAt?.toISOString(),\n },\n null,\n 2\n )\n );\n }\n }\n\n /**\n * Save sub-agent to storage\n */\n private saveSubAgent(subAgent: ClaudeSubAgent): void {\n const path = this.getStoragePath('agents', subAgent.id);\n writeFileSync(path, JSON.stringify(subAgent, null, 2));\n\n if (this.config.createMarkdown) {\n this.saveSubAgentMarkdown(subAgent);\n }\n }\n\n /**\n * Save sub-agent as markdown\n */\n private saveSubAgentMarkdown(subAgent: ClaudeSubAgent): void {\n const path = this.getMarkdownPath('agents', subAgent.id);\n\n const content = `---\ntitle: \"Sub-Agent: ${subAgent.name.slice(0, 50)}\"\ntype: claude-agent\nstatus: ${subAgent.status}\nagent_type: ${subAgent.agentType}\ncreated: ${subAgent.startedAt.toISOString()}\ntags: [${subAgent.metadata.tags.join(', ')}]\n---\n\n# Sub-Agent: ${subAgent.agentType}\n\n**Name:** ${subAgent.name}\n**Task:** ${subAgent.task.slice(0, 200)}${subAgent.task.length > 200 ? '...' : ''}\n\n**Status:** ${subAgent.status}\n**Model:** ${subAgent.model}\n**Spawned:** ${subAgent.startedAt.toISOString()}\n${subAgent.completedAt ? `**Completed:** ${subAgent.completedAt.toISOString()}` : ''}\n\n## Task Description\n\n\\`\\`\\`\n${subAgent.task}\n\\`\\`\\`\n\n${\n subAgent.result\n ? `\n## Result\n\n**Success:** ${subAgent.result.success}\n\n${subAgent.result.summary ? `### Summary\\n${subAgent.result.summary}` : ''}\n\n${subAgent.result.error ? `### Error\\n\\`\\`\\`\\n${subAgent.result.error}\\n\\`\\`\\`` : ''}\n`\n : ''\n}\n\n---\n> Captured by kg-agent hook system\n`;\n\n writeFileSync(path, content);\n }\n\n /**\n * Get current session\n */\n getCurrentSession(): ClaudeSession | null {\n return this.state.storage?.session || null;\n }\n\n /**\n * Get current conversation\n */\n getCurrentConversation(): ClaudeConversation | null {\n if (!this.state.storage || !this.state.currentConversationId) return null;\n return this.state.storage.conversations.get(this.state.currentConversationId) || null;\n }\n\n /**\n * Load session from storage\n */\n loadSession(sessionId: SessionId): ClaudeSession | null {\n const path = this.getStoragePath('sessions', sessionId);\n if (!existsSync(path)) return null;\n\n try {\n const data = readFileSync(path, 'utf-8');\n return JSON.parse(data) as ClaudeSession;\n } catch {\n return null;\n }\n }\n\n /**\n * List all stored sessions\n */\n listSessions(): SessionId[] {\n const sessionsDir = join(this.projectRoot, this.config.storageDir, 'sessions');\n if (!existsSync(sessionsDir)) return [];\n\n try {\n const { readdirSync } = require('fs');\n const files = readdirSync(sessionsDir) as string[];\n return files\n .filter((f: string) => f.endsWith('.json'))\n .map((f: string) => f.replace('.json', '') as SessionId);\n } catch {\n return [];\n }\n }\n}\n\n/**\n * Process hook event from stdin (for use as CLI hook)\n */\nexport async function processHookEvent(\n projectRoot: string,\n eventType: HookEventType,\n config?: Partial<CaptureConfig>\n): Promise<void> {\n const capture = new HookCaptureSystem(projectRoot, config);\n\n // Read event data from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk);\n }\n const inputData = Buffer.concat(chunks).toString('utf-8');\n\n let eventData: HookEventData;\n\n try {\n const parsed = JSON.parse(inputData);\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n toolName: parsed.tool_name || process.env.TOOL_NAME,\n toolInput: parsed.tool_input,\n toolOutput: parsed.tool_output,\n userPrompt: parsed.user_prompt || inputData,\n metadata: parsed,\n };\n } catch {\n // Plain text input (e.g., user prompt)\n eventData = {\n event: eventType,\n timestamp: new Date().toISOString(),\n userPrompt: inputData,\n };\n }\n\n capture.handleHookEvent(eventData);\n}\n\n/**\n * Generate Claude Code hook configuration\n * Uses the new nested format with hooks array required by Claude Code\n */\nexport function generateHookConfig(projectRoot: string): Record<string, unknown> {\n const kgBinPath = 'npx @weavelogic/knowledge-graph-agent';\n\n return {\n hooks: {\n UserPromptSubmit: [\n {\n hooks: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event UserPromptSubmit --path \"${projectRoot}\"`,\n },\n ],\n },\n ],\n PreToolUse: [\n {\n hooks: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PreToolUse --path \"${projectRoot}\"`,\n },\n ],\n },\n ],\n PostToolUse: [\n {\n hooks: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event PostToolUse --path \"${projectRoot}\"`,\n },\n ],\n },\n ],\n Stop: [\n {\n hooks: [\n {\n type: 'command',\n command: `${kgBinPath} hooks capture --event Stop --path \"${projectRoot}\"`,\n },\n ],\n },\n ],\n },\n };\n}\n\nexport default HookCaptureSystem;\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * SPARC CLI Command
3
+ *
4
+ * CLI command for creating comprehensive SPARC plans using
5
+ * concurrent agents, consensus building, and knowledge graph integration.
6
+ *
7
+ * @module cli/commands/sparc
8
+ */
9
+ import { Command } from 'commander';
10
+ /**
11
+ * Create the SPARC command
12
+ */
13
+ export declare function createSPARCCommand(): Command;
14
+ //# sourceMappingURL=sparc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparc.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sparc.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAQ5C"}
@@ -0,0 +1,262 @@
1
+ import { Command } from "commander";
2
+ import { resolve, join } from "path";
3
+ import { existsSync } from "fs";
4
+ import chalk from "chalk";
5
+ import ora from "ora";
6
+ import { createLogger } from "../../utils/logger.js";
7
+ import "../../sparc/decision-log.js";
8
+ import "../../sparc/consensus.js";
9
+ import "../../sparc/review-process.js";
10
+ import { createSPARCPlanner } from "../../sparc/sparc-planner.js";
11
+ const logger = createLogger("cli:sparc");
12
+ function createSPARCCommand() {
13
+ const cmd = new Command("sparc").description("SPARC planning system - create comprehensive development plans").addCommand(createPlanCommand()).addCommand(createReviewCommand()).addCommand(createStatusCommand());
14
+ return cmd;
15
+ }
16
+ function createPlanCommand() {
17
+ return new Command("plan").description("Create a comprehensive SPARC plan").argument("<description>", "Description of what to plan").option("-n, --name <name>", "Plan name", "SPARC Plan").option("-p, --path <path>", "Project root path", process.cwd()).option("-o, --output <dir>", "Output directory for plan artifacts").option("--no-research", "Skip research phase").option("--no-consensus", "Skip consensus building").option("--no-review", "Skip review phase").option("--passes <number>", "Number of review passes", "3").option("--parallel", "Enable parallel research", true).option("--kg", "Enable knowledge graph integration", true).option("--vector", "Enable vector database integration", true).option("--json", "Output result as JSON").action(async (description, options) => {
18
+ const spinner = ora("Initializing SPARC planner...").start();
19
+ try {
20
+ const projectRoot = resolve(options.path);
21
+ const outputDir = options.output ? resolve(options.output) : join(projectRoot, ".sparc");
22
+ if (!existsSync(projectRoot)) {
23
+ spinner.fail(`Project root not found: ${projectRoot}`);
24
+ process.exit(1);
25
+ }
26
+ logger.info("Starting SPARC planning", {
27
+ description,
28
+ projectRoot,
29
+ outputDir
30
+ });
31
+ const plannerOptions = {
32
+ projectRoot,
33
+ outputDir,
34
+ name: options.name,
35
+ description,
36
+ parallelResearch: options.parallel,
37
+ reviewPasses: parseInt(options.passes, 10),
38
+ autoConsensus: options.consensus !== false,
39
+ kgEnabled: options.kg,
40
+ vectorEnabled: options.vector
41
+ };
42
+ spinner.text = "Creating SPARC planner...";
43
+ const planner = createSPARCPlanner(plannerOptions);
44
+ spinner.text = "Executing planning process...";
45
+ const plan = await executePlanningWithProgress(planner, spinner, {
46
+ skipResearch: options.research === false,
47
+ skipConsensus: options.consensus === false,
48
+ skipReview: options.review === false
49
+ });
50
+ spinner.succeed("SPARC planning completed!");
51
+ if (options.json) {
52
+ console.log(JSON.stringify(plan, null, 2));
53
+ } else {
54
+ displayPlanSummary(plan);
55
+ }
56
+ console.log("");
57
+ console.log(chalk.blue("📁 Plan artifacts saved to:"), outputDir);
58
+ console.log(chalk.gray(" - sparc-plan.json"));
59
+ console.log(chalk.gray(" - sparc-plan.md"));
60
+ console.log(chalk.gray(" - decision-log.json"));
61
+ console.log(chalk.gray(" - decision-log.md"));
62
+ } catch (error) {
63
+ spinner.fail("SPARC planning failed");
64
+ logger.error("Planning error", error instanceof Error ? error : new Error(String(error)));
65
+ if (error instanceof Error) {
66
+ console.error(chalk.red("Error:"), error.message);
67
+ }
68
+ process.exit(1);
69
+ }
70
+ });
71
+ }
72
+ async function executePlanningWithProgress(planner, spinner, options) {
73
+ spinner.text = "Phase 1: Research and analysis...";
74
+ await delay(500);
75
+ spinner.text = "Phase 2: Specification...";
76
+ await delay(300);
77
+ spinner.text = "Phase 3: Pseudocode design...";
78
+ await delay(300);
79
+ spinner.text = "Phase 4: Architecture design...";
80
+ await delay(300);
81
+ spinner.text = "Phase 5: Refinement (task breakdown)...";
82
+ await delay(300);
83
+ spinner.text = "Phase 6: Review process...";
84
+ return planner.executePlanning();
85
+ }
86
+ function displayPlanSummary(plan) {
87
+ console.log("");
88
+ console.log(chalk.bold.green("═══════════════════════════════════════════════════════"));
89
+ console.log(chalk.bold.green(` SPARC Plan: ${plan.name}`));
90
+ console.log(chalk.bold.green("═══════════════════════════════════════════════════════"));
91
+ console.log("");
92
+ const statusColor = plan.status === "approved" ? chalk.green : plan.status === "failed" ? chalk.red : chalk.yellow;
93
+ console.log(chalk.bold("Status:"), statusColor(plan.status.toUpperCase()));
94
+ console.log("");
95
+ console.log(chalk.bold("📊 Statistics:"));
96
+ console.log(` Total Tasks: ${plan.statistics.totalTasks}`);
97
+ console.log(` Parallelizable: ${plan.statistics.parallelizableTasks}`);
98
+ console.log(` Estimated Hours: ${plan.statistics.estimatedHours}h`);
99
+ console.log(` Research Findings: ${plan.statistics.researchFindings}`);
100
+ console.log(` Decisions Made: ${plan.statistics.decisions}`);
101
+ console.log("");
102
+ if (plan.specification) {
103
+ console.log(chalk.bold("📋 Specification:"));
104
+ console.log(` Requirements: ${plan.specification.requirements.length}`);
105
+ console.log(` Features: ${plan.specification.features.length}`);
106
+ console.log("");
107
+ }
108
+ if (plan.architecture) {
109
+ console.log(chalk.bold("🏗️ Architecture:"));
110
+ console.log(` Components: ${plan.architecture.components.length}`);
111
+ console.log(` Patterns: ${plan.architecture.patterns.join(", ")}`);
112
+ console.log("");
113
+ }
114
+ console.log(chalk.bold("📝 Tasks by Phase:"));
115
+ const tasksByPhase = /* @__PURE__ */ new Map();
116
+ for (const task of plan.tasks) {
117
+ tasksByPhase.set(task.phase, (tasksByPhase.get(task.phase) || 0) + 1);
118
+ }
119
+ for (const [phase, count] of tasksByPhase.entries()) {
120
+ console.log(` ${phase.padEnd(15)} ${count} tasks`);
121
+ }
122
+ console.log("");
123
+ if (plan.parallelGroups.length > 0) {
124
+ console.log(chalk.bold("⚡ Parallel Execution Groups:"), plan.parallelGroups.length);
125
+ console.log("");
126
+ }
127
+ if (plan.reviewResult) {
128
+ console.log(chalk.bold("🔍 Review Result:"));
129
+ const reviewStatus = plan.reviewResult.overallStatus === "approved" ? chalk.green("APPROVED") : plan.reviewResult.overallStatus === "rejected" ? chalk.red("REJECTED") : chalk.yellow("NEEDS WORK");
130
+ console.log(` Status: ${reviewStatus}`);
131
+ console.log(` Total Findings: ${plan.reviewResult.totalFindings}`);
132
+ console.log(` Critical Findings: ${plan.reviewResult.criticalFindings}`);
133
+ console.log("");
134
+ if (plan.reviewResult.recommendations.length > 0) {
135
+ console.log(chalk.bold("💡 Recommendations:"));
136
+ for (const rec of plan.reviewResult.recommendations) {
137
+ console.log(` • ${rec}`);
138
+ }
139
+ console.log("");
140
+ }
141
+ }
142
+ if (plan.existingCode) {
143
+ console.log(chalk.bold("📂 Existing Code Analysis:"));
144
+ console.log(` Files Found: ${plan.existingCode.fileCount}`);
145
+ console.log(` Entry Points: ${plan.existingCode.entryPoints.length}`);
146
+ console.log(` Patterns: ${plan.existingCode.patterns.join(", ") || "None identified"}`);
147
+ console.log("");
148
+ }
149
+ }
150
+ function createReviewCommand() {
151
+ return new Command("review").description("Review an existing SPARC plan").option("-p, --path <path>", "Path to SPARC plan directory", join(process.cwd(), ".sparc")).option("--passes <number>", "Number of review passes", "3").option("--strict", "Enable strict mode (fail on any finding)").option("--json", "Output result as JSON").action(async (options) => {
152
+ const spinner = ora("Loading SPARC plan...").start();
153
+ try {
154
+ const planPath = resolve(options.path, "sparc-plan.json");
155
+ if (!existsSync(planPath)) {
156
+ spinner.fail(`SPARC plan not found at: ${planPath}`);
157
+ console.log("");
158
+ console.log("Create a plan first with:");
159
+ console.log(chalk.cyan(' kg-agent sparc plan "your project description"'));
160
+ process.exit(1);
161
+ }
162
+ spinner.text = "Loading plan...";
163
+ const planContent = await import("fs").then(
164
+ (fs) => fs.readFileSync(planPath, "utf-8")
165
+ );
166
+ const plan = JSON.parse(planContent);
167
+ plan.createdAt = new Date(plan.createdAt);
168
+ plan.updatedAt = new Date(plan.updatedAt);
169
+ spinner.text = "Running review process...";
170
+ const { createReviewProcess } = await import("../../sparc/index.js");
171
+ const reviewer = createReviewProcess({
172
+ plan,
173
+ passes: parseInt(options.passes, 10),
174
+ strictMode: options.strict
175
+ });
176
+ const result = await reviewer.executeReview();
177
+ spinner.succeed("Review completed!");
178
+ if (options.json) {
179
+ console.log(JSON.stringify(result, null, 2));
180
+ } else {
181
+ displayReviewResult(result);
182
+ }
183
+ } catch (error) {
184
+ spinner.fail("Review failed");
185
+ if (error instanceof Error) {
186
+ console.error(chalk.red("Error:"), error.message);
187
+ }
188
+ process.exit(1);
189
+ }
190
+ });
191
+ }
192
+ function displayReviewResult(result) {
193
+ console.log("");
194
+ console.log(chalk.bold("🔍 Review Result"));
195
+ console.log("");
196
+ const statusColor = result.overallStatus === "approved" ? chalk.green : result.overallStatus === "rejected" ? chalk.red : chalk.yellow;
197
+ console.log("Status:", statusColor(result.overallStatus.toUpperCase()));
198
+ console.log("Total Findings:", result.totalFindings);
199
+ console.log("Critical Findings:", result.criticalFindings);
200
+ console.log("");
201
+ console.log(chalk.bold("Passes:"));
202
+ for (const pass of result.passes) {
203
+ const passStatus = pass.status === "passed" ? chalk.green("✓") : pass.status === "failed" ? chalk.red("✗") : chalk.yellow("?");
204
+ console.log(` ${passStatus} Pass ${pass.passNumber} (${pass.type}): ${pass.findings.length} findings`);
205
+ }
206
+ console.log("");
207
+ if (result.recommendations.length > 0) {
208
+ console.log(chalk.bold("Recommendations:"));
209
+ for (const rec of result.recommendations) {
210
+ console.log(` • ${rec}`);
211
+ }
212
+ }
213
+ }
214
+ function createStatusCommand() {
215
+ return new Command("status").description("Show status of current SPARC plan").option("-p, --path <path>", "Path to SPARC plan directory", join(process.cwd(), ".sparc")).option("--json", "Output as JSON").action(async (options) => {
216
+ try {
217
+ const planPath = resolve(options.path, "sparc-plan.json");
218
+ if (!existsSync(planPath)) {
219
+ console.log(chalk.yellow("No SPARC plan found."));
220
+ console.log("");
221
+ console.log("Create a plan with:");
222
+ console.log(chalk.cyan(' kg-agent sparc plan "your project description"'));
223
+ return;
224
+ }
225
+ const planContent = await import("fs").then(
226
+ (fs) => fs.readFileSync(planPath, "utf-8")
227
+ );
228
+ const plan = JSON.parse(planContent);
229
+ if (options.json) {
230
+ console.log(JSON.stringify({
231
+ id: plan.id,
232
+ name: plan.name,
233
+ status: plan.status,
234
+ currentPhase: plan.currentPhase,
235
+ statistics: plan.statistics
236
+ }, null, 2));
237
+ } else {
238
+ console.log("");
239
+ console.log(chalk.bold(`SPARC Plan: ${plan.name}`));
240
+ console.log("");
241
+ console.log("ID:", plan.id);
242
+ console.log("Status:", plan.status);
243
+ console.log("Phase:", plan.currentPhase);
244
+ console.log("Tasks:", `${plan.statistics.completedTasks}/${plan.statistics.totalTasks}`);
245
+ console.log("Created:", plan.createdAt);
246
+ console.log("");
247
+ }
248
+ } catch (error) {
249
+ if (error instanceof Error) {
250
+ console.error(chalk.red("Error:"), error.message);
251
+ }
252
+ process.exit(1);
253
+ }
254
+ });
255
+ }
256
+ function delay(ms) {
257
+ return new Promise((resolve2) => setTimeout(resolve2, ms));
258
+ }
259
+ export {
260
+ createSPARCCommand
261
+ };
262
+ //# sourceMappingURL=sparc.js.map