mod-bot 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../packages/server/src/index.ts","../packages/server/src/tools/init.ts","../packages/core/src/types.ts","../packages/core/src/config.ts","../packages/core/src/project-state.ts","../packages/core/src/workflow-engine.ts","../packages/core/src/moderator.ts","../packages/analyzer/src/tech-detector.ts","../packages/analyzer/src/codebase-scanner.ts","../packages/analyzer/src/complexity.ts","../packages/analyzer/src/change-tracker.ts","../packages/memory/src/store.ts","../packages/memory/src/project-memory.ts","../packages/memory/src/user-memory.ts","../packages/memory/src/session-memory.ts","../packages/memory/src/pattern-detector.ts","../packages/server/src/tools/moderate.ts","../packages/server/src/tools/context.ts","../packages/server/src/tools/learn.ts","../packages/server/src/tools/swarm.ts"],"sourcesContent":["#!/usr/bin/env node\n\n/**\n * Mod-Bot MCP Server\n *\n * An adaptive code moderation MCP server that learns your preferences,\n * understands your codebase, and tailors its guidance to your experience level.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { registerInitTools } from './tools/init.js';\nimport { registerModerateTools } from './tools/moderate.js';\nimport { registerContextTools } from './tools/context.js';\nimport { registerLearnTools } from './tools/learn.js';\nimport { registerSwarmTools } from './tools/swarm.js';\n\nconst server = new McpServer({\n name: 'mod-bot',\n version: '1.0.0',\n}, {\n capabilities: {\n tools: {},\n },\n});\n\n// Register all tool groups\nregisterInitTools(server);\nregisterModerateTools(server);\nregisterContextTools(server);\nregisterLearnTools(server);\nregisterSwarmTools(server);\n\n// Start stdio transport\nasync function main(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nmain().catch((error: unknown) => {\n console.error('Failed to start mod-bot MCP server:', error);\n process.exit(1);\n});\n","/**\n * Init Tools — Project + user profiling and setup\n *\n * Tools:\n * - init:setup — Run the full init flow\n * - init:reconfig — Re-run user profiling\n * - init:migrate — Update config for new version\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadConfig,\n saveConfig,\n isInitialized,\n ensureModBotDir,\n mergeConfig,\n DEFAULT_CONFIG,\n} from '@mod-bot/core';\nimport type { ModBotConfig, ExperienceLevel, ProjectStatus } from '@mod-bot/core';\nimport { scanProject } from '@mod-bot/analyzer';\nimport { ProjectMemory } from '@mod-bot/memory';\n\nfunction getProjectRoot(): string {\n return process.cwd();\n}\n\nexport function registerInitTools(server: McpServer): void {\n // init:setup — Full project + user profiling\n server.tool(\n 'init_setup',\n 'Initialize mod-bot for the current project. Scans the codebase, creates config, and provides recommendations.',\n {\n name: z.string().optional().describe('Your name'),\n experienceLevel: z.enum(['junior', 'mid', 'senior', 'lead']).optional().describe('Your experience level'),\n primaryLanguages: z.array(z.string()).optional().describe('Languages you are strongest in'),\n learningLanguages: z.array(z.string()).optional().describe('Languages you are learning'),\n projectType: z.enum(['personal', 'team', 'enterprise']).optional().describe('Project type'),\n priorities: z.array(z.string()).optional().describe('Project priorities (e.g., speed, quality, learning)'),\n },\n async (args) => {\n const projectRoot = getProjectRoot();\n\n // Phase 1: Project Profiling\n const scanResult = await scanProject(projectRoot);\n\n // Store project memory\n await ensureModBotDir(projectRoot);\n const memory = new ProjectMemory(projectRoot + '/.mod-bot');\n await memory.setTechStack(\n scanResult.frameworks.map(f => ({ language: Object.keys(scanResult.languages)[0] ?? 'Unknown', framework: f })),\n );\n\n // Phase 2: Build config from user input + scan results\n const userOverrides: Partial<ModBotConfig> = {\n user: {\n ...DEFAULT_CONFIG.user,\n name: args.name ?? '',\n experienceLevel: (args.experienceLevel as ExperienceLevel) ?? 'mid',\n primaryLanguages: args.primaryLanguages ?? Object.keys(scanResult.languages),\n learningLanguages: args.learningLanguages ?? [],\n },\n project: {\n status: scanResult.status as ProjectStatus,\n type: args.projectType ?? 'personal',\n priorities: args.priorities ?? ['quality'],\n },\n };\n\n const config = mergeConfig(DEFAULT_CONFIG, userOverrides);\n await saveConfig(projectRoot, config);\n\n // Phase 3: Generate recommendations\n const recommendations: string[] = [];\n\n if (!scanResult.hasTests) {\n recommendations.push('No tests detected. Consider setting up a test framework and enabling TDD enforcement.');\n } else if (scanResult.testFrameworks.length > 0) {\n recommendations.push(`Test framework detected: ${scanResult.testFrameworks.join(', ')}. TDD suggestion mode is active.`);\n }\n\n if (!scanResult.hasCICD) {\n recommendations.push('No CI/CD pipeline detected. Consider adding GitHub Actions or similar.');\n }\n\n if (!scanResult.hasDocumentation) {\n recommendations.push('No documentation directory found. Consider adding a docs/ folder.');\n }\n\n if (scanResult.status === 'greenfield') {\n recommendations.push('This looks like a new project. Mod-bot will provide extra guidance during initial setup.');\n }\n\n const languageSummary = Object.entries(scanResult.languages)\n .sort(([, a], [, b]) => b - a)\n .map(([lang, count]) => `${lang} (${count} files)`)\n .join(', ');\n\n const output = [\n `# Mod-Bot Initialized`,\n ``,\n `## Project Profile`,\n `- **Status:** ${scanResult.status}`,\n `- **Languages:** ${languageSummary || 'none detected'}`,\n `- **Frameworks:** ${scanResult.frameworks.join(', ') || 'none detected'}`,\n `- **Tests:** ${scanResult.hasTests ? `Yes (${scanResult.testFrameworks.join(', ')})` : 'No'}`,\n `- **CI/CD:** ${scanResult.hasCICD ? scanResult.cicdTools.join(', ') : 'No'}`,\n `- **Total Files:** ${scanResult.totalFiles}`,\n `- **Estimated Lines:** ${scanResult.totalLines.toLocaleString()}`,\n ``,\n `## User Profile`,\n `- **Name:** ${config.user.name || '(not set)'}`,\n `- **Level:** ${config.user.experienceLevel}`,\n `- **Explanation Depth:** ${config.user.explanationDepth}`,\n `- **Workflow:** ${config.user.workflowPreference}`,\n ``,\n `## Recommendations`,\n ...recommendations.map(r => `- ${r}`),\n ``,\n `Configuration saved to \\`.mod-bot/config.yaml\\`. Use \\`init:reconfig\\` to update preferences.`,\n ];\n\n return { content: [{ type: 'text' as const, text: output.join('\\n') }] };\n },\n );\n\n // init:reconfig — Re-run user profiling\n server.tool(\n 'init_reconfig',\n 'Update your mod-bot preferences without re-scanning the project.',\n {\n name: z.string().optional().describe('Your name'),\n experienceLevel: z.enum(['junior', 'mid', 'senior', 'lead']).optional(),\n primaryLanguages: z.array(z.string()).optional(),\n learningLanguages: z.array(z.string()).optional(),\n visualPreference: z.enum(['minimal', 'moderate', 'verbose']).optional(),\n explanationDepth: z.enum(['terse', 'standard', 'detailed']).optional(),\n workflowPreference: z.enum(['guided', 'autonomous', 'adaptive']).optional(),\n tddEnforcement: z.enum(['off', 'suggest', 'enforce']).optional(),\n swarmBudget: z.enum(['conservative', 'moderate', 'unlimited']).optional(),\n reviewBeforeCommit: z.boolean().optional(),\n },\n async (args) => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const current = await loadConfig(projectRoot);\n const updated = mergeConfig(current, {\n user: {\n ...current.user,\n ...(args.name !== undefined && { name: args.name }),\n ...(args.experienceLevel !== undefined && { experienceLevel: args.experienceLevel }),\n ...(args.primaryLanguages !== undefined && { primaryLanguages: args.primaryLanguages }),\n ...(args.learningLanguages !== undefined && { learningLanguages: args.learningLanguages }),\n ...(args.visualPreference !== undefined && { visualPreference: args.visualPreference }),\n ...(args.explanationDepth !== undefined && { explanationDepth: args.explanationDepth }),\n ...(args.workflowPreference !== undefined && { workflowPreference: args.workflowPreference }),\n },\n moderation: {\n ...current.moderation,\n ...(args.tddEnforcement !== undefined && { tddEnforcement: args.tddEnforcement }),\n ...(args.swarmBudget !== undefined && { swarmBudget: args.swarmBudget }),\n ...(args.reviewBeforeCommit !== undefined && { reviewBeforeCommit: args.reviewBeforeCommit }),\n },\n });\n\n await saveConfig(projectRoot, updated);\n\n return {\n content: [{\n type: 'text' as const,\n text: `Configuration updated. Level: ${updated.user.experienceLevel}, Depth: ${updated.user.explanationDepth}, Workflow: ${updated.user.workflowPreference}`,\n }],\n };\n },\n );\n\n // init:migrate — Update config schema\n server.tool(\n 'init_migrate',\n 'Migrate mod-bot config to the latest version.',\n {},\n async () => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const config = await loadConfig(projectRoot);\n config.version = '1.0.0';\n await saveConfig(projectRoot, config);\n\n return {\n content: [{ type: 'text' as const, text: 'Config migrated to v1.0.0.' }],\n };\n },\n );\n}\n","export type ExperienceLevel = 'junior' | 'mid' | 'senior' | 'lead';\n\nexport type VisualPreference = 'minimal' | 'moderate' | 'verbose';\n\nexport type ExplanationDepth = 'terse' | 'standard' | 'detailed';\n\nexport type WorkflowPreference = 'guided' | 'autonomous' | 'adaptive';\n\nexport type ProjectStatus = 'greenfield' | 'brownfield' | 'fork';\n\nexport type ProjectType = 'personal' | 'team' | 'enterprise';\n\nexport type SwarmBudget = 'conservative' | 'moderate' | 'unlimited';\n\nexport type TddEnforcement = 'off' | 'suggest' | 'enforce';\n\nexport type TaskComplexity = 'trivial' | 'simple' | 'moderate' | 'complex' | 'epic';\n\nexport interface UserProfile {\n name: string;\n experienceLevel: ExperienceLevel;\n primaryLanguages: string[];\n learningLanguages: string[];\n visualPreference: VisualPreference;\n explanationDepth: ExplanationDepth;\n workflowPreference: WorkflowPreference;\n}\n\nexport interface ProjectConfig {\n status: ProjectStatus;\n type: ProjectType;\n priorities: string[];\n}\n\nexport interface ModerationConfig {\n autoSuggest: boolean;\n learnPatterns: boolean;\n swarmBudget: SwarmBudget;\n tddEnforcement: TddEnforcement;\n reviewBeforeCommit: boolean;\n}\n\nexport interface ModBotConfig {\n version: string;\n user: UserProfile;\n project: ProjectConfig;\n moderation: ModerationConfig;\n}\n\nexport const DEFAULT_CONFIG: ModBotConfig = {\n version: '1.0.0',\n user: {\n name: '',\n experienceLevel: 'mid',\n primaryLanguages: [],\n learningLanguages: [],\n visualPreference: 'moderate',\n explanationDepth: 'standard',\n workflowPreference: 'adaptive',\n },\n project: {\n status: 'brownfield',\n type: 'personal',\n priorities: ['quality'],\n },\n moderation: {\n autoSuggest: true,\n learnPatterns: true,\n swarmBudget: 'conservative',\n tddEnforcement: 'suggest',\n reviewBeforeCommit: true,\n },\n};\n\nexport interface ProjectScanResult {\n languages: Record<string, number>;\n frameworks: string[];\n packageManagers: string[];\n hasTests: boolean;\n testFrameworks: string[];\n hasCICD: boolean;\n cicdTools: string[];\n hasDocumentation: boolean;\n totalFiles: number;\n totalLines: number;\n status: ProjectStatus;\n rootPath: string;\n}\n\nexport interface TechStack {\n language: string;\n framework?: string;\n packageManager?: string;\n testFramework?: string;\n buildTool?: string;\n}\n\nexport interface GitState {\n isRepo: boolean;\n currentBranch: string;\n hasUncommittedChanges: boolean;\n stagedFiles: string[];\n modifiedFiles: string[];\n untrackedFiles: string[];\n aheadOfRemote: number;\n behindRemote: number;\n recentCommits: CommitInfo[];\n remotes: RemoteInfo[];\n}\n\nexport interface CommitInfo {\n hash: string;\n message: string;\n author: string;\n date: string;\n}\n\nexport interface RemoteInfo {\n name: string;\n url: string;\n}\n\nexport interface ProjectState {\n lastScanAt: string;\n currentTask?: string;\n currentBranch: string;\n focusArea?: string;\n decisions: DecisionEntry[];\n openQuestions: string[];\n healthMetrics: HealthMetrics;\n}\n\nexport interface DecisionEntry {\n id: string;\n description: string;\n rationale: string;\n timestamp: string;\n category: string;\n}\n\nexport interface HealthMetrics {\n testPassRate?: number;\n lintErrorCount?: number;\n buildPassing?: boolean;\n lastCheckedAt: string;\n}\n\nexport type PatternType = 'code_style' | 'workflow' | 'naming' | 'architecture' | 'testing' | 'preference';\n\nexport interface LearnedPattern {\n id: string;\n type: PatternType;\n description: string;\n confidence: number;\n occurrences: number;\n firstSeen: string;\n lastSeen: string;\n}\n\nexport interface IgnoredSuggestion {\n count: number;\n action: 'reduce_frequency' | 'suppress';\n}\n\nexport interface UserMemoryData {\n patterns: LearnedPattern[];\n ignoredSuggestions: Record<string, IgnoredSuggestion>;\n workflowPreferences: Record<string, boolean>;\n}\n\nexport interface ProjectMemoryData {\n techStack: TechStack[];\n conventions: string[];\n knownIssues: string[];\n architecture: string;\n lastUpdated: string;\n}\n\nexport interface SessionEntry {\n id: string;\n startedAt: string;\n endedAt?: string;\n task: string;\n decisions: DecisionEntry[];\n summary?: string;\n}\n\nexport interface SessionMemoryData {\n sessions: SessionEntry[];\n}\n\nexport interface ModerationResult {\n content: string;\n metadata?: Record<string, unknown>;\n suggestions?: string[];\n warnings?: string[];\n}\n\nexport interface ComplexityAssessment {\n level: TaskComplexity;\n score: number;\n factors: string[];\n estimatedTokens?: number;\n recommendSwarm: boolean;\n}\n\nexport interface SwarmEstimate {\n agentCount: number;\n estimatedTokens: number;\n estimatedCostUsd: number;\n tasks: string[];\n withinBudget: boolean;\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { z } from 'zod';\nimport type { ModBotConfig } from './types.js';\nimport { DEFAULT_CONFIG } from './types.js';\n\nconst MOD_BOT_DIR = '.mod-bot';\nconst CONFIG_FILE = 'config.yaml';\n\nconst userProfileSchema = z.object({\n name: z.string().default(''),\n experienceLevel: z.enum(['junior', 'mid', 'senior', 'lead']).default('mid'),\n primaryLanguages: z.array(z.string()).default([]),\n learningLanguages: z.array(z.string()).default([]),\n visualPreference: z.enum(['minimal', 'moderate', 'verbose']).default('moderate'),\n explanationDepth: z.enum(['terse', 'standard', 'detailed']).default('standard'),\n workflowPreference: z.enum(['guided', 'autonomous', 'adaptive']).default('adaptive'),\n});\n\nconst projectConfigSchema = z.object({\n status: z.enum(['greenfield', 'brownfield', 'fork']).default('brownfield'),\n type: z.enum(['personal', 'team', 'enterprise']).default('personal'),\n priorities: z.array(z.string()).default(['quality']),\n});\n\nconst moderationConfigSchema = z.object({\n autoSuggest: z.boolean().default(true),\n learnPatterns: z.boolean().default(true),\n swarmBudget: z.enum(['conservative', 'moderate', 'unlimited']).default('conservative'),\n tddEnforcement: z.enum(['off', 'suggest', 'enforce']).default('suggest'),\n reviewBeforeCommit: z.boolean().default(true),\n});\n\nconst modBotConfigSchema = z.object({\n version: z.string().default('1.0.0'),\n user: userProfileSchema.default({}),\n project: projectConfigSchema.default({}),\n moderation: moderationConfigSchema.default({}),\n});\n\nexport function getModBotDir(projectRoot: string): string {\n return join(projectRoot, MOD_BOT_DIR);\n}\n\nexport function getConfigPath(projectRoot: string): string {\n return join(getModBotDir(projectRoot), CONFIG_FILE);\n}\n\nexport async function ensureModBotDir(projectRoot: string): Promise<string> {\n const dir = getModBotDir(projectRoot);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n const memoryDir = join(dir, 'memory', 'sessions');\n if (!existsSync(memoryDir)) {\n await mkdir(memoryDir, { recursive: true });\n }\n return dir;\n}\n\nexport async function loadConfig(projectRoot: string): Promise<ModBotConfig> {\n const configPath = getConfigPath(projectRoot);\n if (!existsSync(configPath)) {\n return structuredClone(DEFAULT_CONFIG);\n }\n const raw = await readFile(configPath, 'utf-8');\n const parsed = parseYaml(raw);\n return modBotConfigSchema.parse(parsed);\n}\n\nexport async function saveConfig(projectRoot: string, config: ModBotConfig): Promise<void> {\n await ensureModBotDir(projectRoot);\n const configPath = getConfigPath(projectRoot);\n const yamlStr = stringifyYaml(config, { indent: 2 });\n await writeFile(configPath, yamlStr, 'utf-8');\n}\n\nexport function validateConfig(data: unknown): ModBotConfig {\n return modBotConfigSchema.parse(data);\n}\n\nexport function mergeConfig(base: ModBotConfig, overrides: Partial<ModBotConfig>): ModBotConfig {\n return {\n version: overrides.version ?? base.version,\n user: { ...base.user, ...overrides.user },\n project: { ...base.project, ...overrides.project },\n moderation: { ...base.moderation, ...overrides.moderation },\n };\n}\n\nexport function isInitialized(projectRoot: string): boolean {\n return existsSync(getConfigPath(projectRoot));\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport type { DecisionEntry, HealthMetrics, ProjectState } from './types.js';\nimport { getModBotDir, ensureModBotDir } from './config.js';\n\nconst STATE_FILE = 'state.json';\n\nfunction getStatePath(projectRoot: string): string {\n return join(getModBotDir(projectRoot), STATE_FILE);\n}\n\nfunction defaultState(): ProjectState {\n return {\n lastScanAt: new Date().toISOString(),\n currentBranch: 'main',\n decisions: [],\n openQuestions: [],\n healthMetrics: { lastCheckedAt: new Date().toISOString() },\n };\n}\n\nexport async function loadProjectState(projectRoot: string): Promise<ProjectState> {\n const statePath = getStatePath(projectRoot);\n if (!existsSync(statePath)) {\n return defaultState();\n }\n const raw = await readFile(statePath, 'utf-8');\n return JSON.parse(raw) as ProjectState;\n}\n\nexport async function saveProjectState(projectRoot: string, state: ProjectState): Promise<void> {\n await ensureModBotDir(projectRoot);\n const statePath = getStatePath(projectRoot);\n await writeFile(statePath, JSON.stringify(state, null, 2), 'utf-8');\n}\n\nexport async function updateProjectState(\n projectRoot: string,\n updater: (state: ProjectState) => ProjectState,\n): Promise<ProjectState> {\n const state = await loadProjectState(projectRoot);\n const updated = updater(state);\n await saveProjectState(projectRoot, updated);\n return updated;\n}\n\nexport function addDecision(state: ProjectState, description: string, rationale: string, category: string): ProjectState {\n const entry: DecisionEntry = {\n id: randomUUID(),\n description,\n rationale,\n timestamp: new Date().toISOString(),\n category,\n };\n return { ...state, decisions: [...state.decisions, entry] };\n}\n\nexport function setFocus(state: ProjectState, area: string): ProjectState {\n return { ...state, focusArea: area };\n}\n\nexport function setTask(state: ProjectState, task: string): ProjectState {\n return { ...state, currentTask: task };\n}\n\nexport function updateHealthMetrics(state: ProjectState, metrics: Partial<HealthMetrics>): ProjectState {\n return {\n ...state,\n healthMetrics: {\n ...state.healthMetrics,\n ...metrics,\n lastCheckedAt: new Date().toISOString(),\n },\n };\n}\n\nexport function addQuestion(state: ProjectState, question: string): ProjectState {\n return { ...state, openQuestions: [...state.openQuestions, question] };\n}\n\nexport function resolveQuestion(state: ProjectState, index: number): ProjectState {\n return {\n ...state,\n openQuestions: state.openQuestions.filter((_, i) => i !== index),\n };\n}\n","import type { ModBotConfig, TaskComplexity } from './types.js';\n\nexport type WorkflowType =\n | 'direct'\n | 'guided'\n | 'tdd'\n | 'plan-first'\n | 'review-first'\n | 'swarm';\n\ninterface WorkflowRecommendation {\n type: WorkflowType;\n reason: string;\n steps: string[];\n}\n\nexport function recommendWorkflow(\n config: ModBotConfig,\n taskDescription: string,\n complexity: TaskComplexity,\n): WorkflowRecommendation {\n const { user, moderation } = config;\n\n if (complexity === 'epic' && moderation.swarmBudget !== 'conservative') {\n return {\n type: 'swarm',\n reason: 'Task complexity warrants multi-agent coordination.',\n steps: ['Estimate swarm cost', 'Spawn analysis agents', 'Synthesize results', 'Review and apply'],\n };\n }\n\n const isNewFeature = /\\b(add|create|implement|build|new)\\b/i.test(taskDescription);\n if (moderation.tddEnforcement === 'enforce' && isNewFeature) {\n return {\n type: 'tdd',\n reason: 'TDD enforcement is enabled for new features.',\n steps: ['Write failing test', 'Verify test fails', 'Implement minimal code', 'Verify test passes', 'Refactor'],\n };\n }\n\n if (user.experienceLevel === 'junior' || user.workflowPreference === 'guided') {\n if (complexity === 'trivial' || complexity === 'simple') {\n return {\n type: 'guided',\n reason: 'Step-by-step guidance for manageable task.',\n steps: ['Understand the task', 'Identify files to change', 'Make changes', 'Test', 'Review'],\n };\n }\n return {\n type: 'plan-first',\n reason: 'Complex task benefits from upfront planning.',\n steps: ['Analyze requirements', 'Create implementation plan', 'Execute steps', 'Verify each step', 'Final review'],\n };\n }\n\n if (user.experienceLevel === 'senior' || user.experienceLevel === 'lead') {\n if (complexity === 'trivial' || complexity === 'simple') {\n return {\n type: 'direct',\n reason: 'Straightforward task for experienced developer.',\n steps: ['Implement', 'Verify'],\n };\n }\n }\n\n if (complexity === 'moderate' || complexity === 'complex') {\n return {\n type: 'plan-first',\n reason: 'Task complexity warrants planning.',\n steps: ['Analyze', 'Plan', 'Implement', 'Test', 'Review'],\n };\n }\n\n if (moderation.tddEnforcement === 'suggest' && isNewFeature) {\n return {\n type: 'tdd',\n reason: 'Consider TDD for this new feature.',\n steps: ['Write failing test', 'Implement', 'Refactor'],\n };\n }\n\n return {\n type: 'direct',\n reason: 'Simple task, direct approach.',\n steps: ['Implement', 'Verify'],\n };\n}\n","import type {\n ComplexityAssessment,\n ModBotConfig,\n ModerationResult,\n ProjectState,\n UserMemoryData,\n} from './types.js';\nimport { recommendWorkflow } from './workflow-engine.js';\n\nexport interface ModeratorContext {\n config: ModBotConfig;\n projectState: ProjectState;\n userMemory: UserMemoryData;\n projectRoot: string;\n}\n\nexport class Moderator {\n private ctx: ModeratorContext;\n\n constructor(ctx: ModeratorContext) {\n this.ctx = ctx;\n }\n\n updateContext(partial: Partial<ModeratorContext>): void {\n this.ctx = { ...this.ctx, ...partial };\n }\n\n get config(): ModBotConfig {\n return this.ctx.config;\n }\n\n get userLevel(): string {\n return this.ctx.config.user.experienceLevel;\n }\n\n suggest(taskDescription: string, complexity: ComplexityAssessment): ModerationResult {\n const workflow = recommendWorkflow(this.ctx.config, taskDescription, complexity.level);\n const { user } = this.ctx.config;\n\n let content: string;\n if (user.experienceLevel === 'senior' || user.experienceLevel === 'lead') {\n content = this.formatTerse(taskDescription, workflow, complexity);\n } else if (user.experienceLevel === 'junior') {\n content = this.formatDetailed(taskDescription, workflow, complexity);\n } else {\n content = this.formatStandard(taskDescription, workflow, complexity);\n }\n\n return {\n content,\n suggestions: workflow.steps,\n metadata: { workflow: workflow.type, complexity: complexity.level },\n };\n }\n\n review(changes: string, _context?: string): ModerationResult {\n const { user } = this.ctx.config;\n const warnings: string[] = [];\n const suggestions: string[] = [];\n\n if (changes.includes('console.log') && !changes.includes('test')) {\n warnings.push('Debug console.log detected in production code.');\n }\n if (changes.includes('any') && changes.includes('.ts')) {\n warnings.push('TypeScript `any` type detected — consider adding proper types.');\n }\n if (changes.includes('TODO') || changes.includes('FIXME')) {\n suggestions.push('TODO/FIXME comments found — consider tracking in issue tracker.');\n }\n\n const { userMemory } = this.ctx;\n const filteredWarnings = warnings.filter(w => {\n const key = w.substring(0, 30).trim().toLowerCase().replace(/\\s+/g, '-');\n const ignored = userMemory.ignoredSuggestions[key];\n return !ignored || ignored.action !== 'suppress';\n });\n\n let content: string;\n if (user.experienceLevel === 'senior' || user.experienceLevel === 'lead') {\n content = this.formatReviewTerse(filteredWarnings, suggestions);\n } else {\n content = this.formatReviewDetailed(filteredWarnings, suggestions, changes);\n }\n\n return { content, warnings: filteredWarnings, suggestions };\n }\n\n plan(taskDescription: string, complexity: ComplexityAssessment): ModerationResult {\n const workflow = recommendWorkflow(this.ctx.config, taskDescription, complexity.level);\n const { user } = this.ctx.config;\n\n const steps = workflow.steps.map((step, i) => {\n if (user.experienceLevel === 'junior') {\n return `${i + 1}. **${step}**\\n _What:_ ${this.expandStep(step)}\\n _Why:_ ${this.explainStep(step)}`;\n }\n return `${i + 1}. ${step}`;\n });\n\n const content = [\n `## Implementation Plan`,\n ``,\n `**Workflow:** ${workflow.type}`,\n `**Reason:** ${workflow.reason}`,\n `**Complexity:** ${complexity.level} (${complexity.score}/100)`,\n ``,\n `### Steps`,\n ``,\n ...steps,\n ].join('\\n');\n\n return { content, metadata: { workflow: workflow.type } };\n }\n\n checkpoint(): ModerationResult {\n const { projectState } = this.ctx;\n const parts: string[] = [\n `## Checkpoint`,\n ``,\n `**Branch:** ${projectState.currentBranch}`,\n ];\n\n if (projectState.currentTask) {\n parts.push(`**Task:** ${projectState.currentTask}`);\n }\n if (projectState.focusArea) {\n parts.push(`**Focus:** ${projectState.focusArea}`);\n }\n if (projectState.decisions.length > 0) {\n parts.push(``, `### Recent Decisions`);\n for (const d of projectState.decisions.slice(-5)) {\n parts.push(`- ${d.description} — _${d.rationale}_`);\n }\n }\n if (projectState.openQuestions.length > 0) {\n parts.push(``, `### Open Questions`);\n for (const q of projectState.openQuestions) {\n parts.push(`- ${q}`);\n }\n }\n\n return { content: parts.join('\\n') };\n }\n\n retro(taskSummary: string): ModerationResult {\n const content = [\n `## Retrospective`,\n ``,\n `**Task:** ${taskSummary}`,\n ``,\n `### What went well`,\n `- Task completed`,\n ``,\n `### What could improve`,\n `- (Review your decisions and note any patterns)`,\n ``,\n `### Learned patterns`,\n `- (Any new patterns detected will be saved to memory)`,\n ].join('\\n');\n\n return { content };\n }\n\n private formatTerse(\n _task: string,\n workflow: { type: string; reason: string; steps: string[] },\n complexity: ComplexityAssessment,\n ): string {\n return `**${workflow.type}** (${complexity.level}): ${workflow.steps.join(' → ')}`;\n }\n\n private formatStandard(\n _task: string,\n workflow: { type: string; reason: string; steps: string[] },\n complexity: ComplexityAssessment,\n ): string {\n return [\n `**Approach:** ${workflow.type}`,\n `**Complexity:** ${complexity.level}`,\n `${workflow.reason}`,\n ``,\n `Steps: ${workflow.steps.map((s, i) => `${i + 1}. ${s}`).join('\\n')}`,\n ].join('\\n');\n }\n\n private formatDetailed(\n _task: string,\n workflow: { type: string; reason: string; steps: string[] },\n complexity: ComplexityAssessment,\n ): string {\n const lines = [\n `## Suggested Approach`,\n ``,\n `I recommend the **${workflow.type}** workflow for this task.`,\n ``,\n `**Why?** ${workflow.reason}`,\n ``,\n `**Complexity:** ${complexity.level} (${complexity.score}/100)`,\n ];\n if (complexity.factors.length > 0) {\n lines.push(`**Factors:** ${complexity.factors.join(', ')}`);\n }\n lines.push(``, `### Steps to Follow`, ``);\n for (const [i, step] of workflow.steps.entries()) {\n lines.push(`${i + 1}. **${step}**`);\n lines.push(` ${this.expandStep(step)}`);\n lines.push(``);\n }\n return lines.join('\\n');\n }\n\n private formatReviewTerse(warnings: string[], suggestions: string[]): string {\n if (warnings.length === 0 && suggestions.length === 0) return 'LGTM';\n const parts: string[] = [];\n for (const w of warnings) parts.push(`⚠ ${w}`);\n for (const s of suggestions) parts.push(`💡 ${s}`);\n return parts.join('\\n');\n }\n\n private formatReviewDetailed(warnings: string[], suggestions: string[], _changes: string): string {\n const parts = [`## Code Review`, ``];\n if (warnings.length > 0) {\n parts.push(`### Warnings`, ``);\n for (const w of warnings) {\n parts.push(`- ⚠ **${w}**`);\n parts.push(` _Consider addressing this before committing._`);\n }\n parts.push(``);\n }\n if (suggestions.length > 0) {\n parts.push(`### Suggestions`, ``);\n for (const s of suggestions) parts.push(`- 💡 ${s}`);\n parts.push(``);\n }\n if (warnings.length === 0 && suggestions.length === 0) {\n parts.push(`Looks good! No issues detected.`);\n }\n return parts.join('\\n');\n }\n\n private expandStep(step: string): string {\n const expansions: Record<string, string> = {\n 'Write failing test': 'Create a test that describes the expected behavior. It should fail because the feature does not exist yet.',\n 'Verify test fails': 'Run the test and confirm it fails with the expected error message.',\n 'Implement minimal code': 'Write only enough code to make the failing test pass. Resist adding extras.',\n 'Verify test passes': 'Run the test again. All tests should now be green.',\n 'Refactor': 'Clean up the code while keeping all tests passing.',\n 'Implement': 'Write the code changes needed.',\n 'Verify': 'Run tests and check that everything works correctly.',\n 'Analyze requirements': 'Read the task description and identify exactly what needs to change.',\n 'Create implementation plan': 'List the files to modify and the specific changes for each.',\n 'Test': 'Run the test suite to verify your changes.',\n 'Review': 'Look over your changes for any issues before committing.',\n };\n return expansions[step] ?? 'Complete this step and verify the result.';\n }\n\n private explainStep(step: string): string {\n const explanations: Record<string, string> = {\n 'Write failing test': 'TDD starts with a test so you know exactly when the feature works.',\n 'Verify test fails': 'Confirming the test fails proves it actually tests something meaningful.',\n 'Implement minimal code': 'Minimal code prevents over-engineering and keeps changes focused.',\n 'Refactor': 'Now that tests protect you, you can safely improve code structure.',\n };\n return explanations[step] ?? 'This ensures quality and correctness.';\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nexport interface TechStack {\n language: string;\n framework?: string;\n packageManager?: string;\n testFramework?: string;\n buildTool?: string;\n}\n\ninterface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nconst FRAMEWORK_DETECTORS: Array<{ name: string; deps: string[] }> = [\n { name: 'Next.js', deps: ['next'] },\n { name: 'React', deps: ['react'] },\n { name: 'Vue', deps: ['vue'] },\n { name: 'Angular', deps: ['@angular/core'] },\n { name: 'Svelte', deps: ['svelte'] },\n { name: 'Express', deps: ['express'] },\n { name: 'Fastify', deps: ['fastify'] },\n { name: 'Hono', deps: ['hono'] },\n { name: 'NestJS', deps: ['@nestjs/core'] },\n { name: 'Django', deps: [] }, // detected via requirements.txt/pyproject.toml\n { name: 'Flask', deps: [] },\n { name: 'FastAPI', deps: [] },\n];\n\nconst TEST_FRAMEWORK_DETECTORS: Array<{ name: string; deps: string[] }> = [\n { name: 'vitest', deps: ['vitest'] },\n { name: 'jest', deps: ['jest', '@jest/core'] },\n { name: 'mocha', deps: ['mocha'] },\n { name: 'pytest', deps: [] },\n { name: 'ava', deps: ['ava'] },\n { name: 'tap', deps: ['tap'] },\n];\n\nconst BUILD_TOOL_DETECTORS: Array<{ name: string; files: string[] }> = [\n { name: 'vite', files: ['vite.config.ts', 'vite.config.js'] },\n { name: 'webpack', files: ['webpack.config.js', 'webpack.config.ts'] },\n { name: 'esbuild', files: ['esbuild.config.js'] },\n { name: 'rollup', files: ['rollup.config.js', 'rollup.config.ts'] },\n { name: 'turbo', files: ['turbo.json'] },\n { name: 'nx', files: ['nx.json'] },\n];\n\nasync function readPackageJson(rootPath: string): Promise<PackageJson | null> {\n const pkgPath = join(rootPath, 'package.json');\n if (!existsSync(pkgPath)) return null;\n const raw = await readFile(pkgPath, 'utf-8');\n return JSON.parse(raw) as PackageJson;\n}\n\nfunction allDeps(pkg: PackageJson): Record<string, string> {\n return { ...pkg.dependencies, ...pkg.devDependencies };\n}\n\nexport async function detectTechStack(rootPath: string): Promise<TechStack[]> {\n const stacks: TechStack[] = [];\n\n // Node.js / JavaScript / TypeScript\n const pkg = await readPackageJson(rootPath);\n if (pkg) {\n const deps = allDeps(pkg);\n const hasTypeScript = existsSync(join(rootPath, 'tsconfig.json')) || 'typescript' in deps;\n const language = hasTypeScript ? 'TypeScript' : 'JavaScript';\n\n // Detect package manager\n let packageManager = 'npm';\n if (existsSync(join(rootPath, 'pnpm-lock.yaml')) || existsSync(join(rootPath, 'pnpm-workspace.yaml'))) {\n packageManager = 'pnpm';\n } else if (existsSync(join(rootPath, 'yarn.lock'))) {\n packageManager = 'yarn';\n } else if (existsSync(join(rootPath, 'bun.lockb'))) {\n packageManager = 'bun';\n }\n\n // Detect framework\n let framework: string | undefined;\n for (const f of FRAMEWORK_DETECTORS) {\n if (f.deps.some(d => d in deps)) {\n framework = f.name;\n break;\n }\n }\n\n // Detect test framework\n let testFramework: string | undefined;\n for (const t of TEST_FRAMEWORK_DETECTORS) {\n if (t.deps.some(d => d in deps)) {\n testFramework = t.name;\n break;\n }\n }\n\n // Detect build tool\n let buildTool: string | undefined;\n for (const b of BUILD_TOOL_DETECTORS) {\n if (b.files.some(f => existsSync(join(rootPath, f)))) {\n buildTool = b.name;\n break;\n }\n }\n\n stacks.push({ language, framework, packageManager, testFramework, buildTool });\n }\n\n // Python\n if (\n existsSync(join(rootPath, 'requirements.txt')) ||\n existsSync(join(rootPath, 'pyproject.toml')) ||\n existsSync(join(rootPath, 'setup.py'))\n ) {\n const stack: TechStack = { language: 'Python' };\n if (existsSync(join(rootPath, 'pyproject.toml'))) {\n const content = await readFile(join(rootPath, 'pyproject.toml'), 'utf-8');\n if (content.includes('django')) stack.framework = 'Django';\n else if (content.includes('flask')) stack.framework = 'Flask';\n else if (content.includes('fastapi')) stack.framework = 'FastAPI';\n if (content.includes('pytest')) stack.testFramework = 'pytest';\n stack.packageManager = content.includes('[tool.poetry]') ? 'poetry' : 'pip';\n }\n stacks.push(stack);\n }\n\n // Go\n if (existsSync(join(rootPath, 'go.mod'))) {\n stacks.push({ language: 'Go', packageManager: 'go modules' });\n }\n\n // Rust\n if (existsSync(join(rootPath, 'Cargo.toml'))) {\n stacks.push({ language: 'Rust', packageManager: 'cargo' });\n }\n\n // Ruby\n if (existsSync(join(rootPath, 'Gemfile'))) {\n const stack: TechStack = { language: 'Ruby', packageManager: 'bundler' };\n if (existsSync(join(rootPath, 'config', 'routes.rb'))) {\n stack.framework = 'Rails';\n }\n stacks.push(stack);\n }\n\n // Java / Kotlin\n if (existsSync(join(rootPath, 'pom.xml'))) {\n stacks.push({ language: 'Java', packageManager: 'maven' });\n } else if (existsSync(join(rootPath, 'build.gradle')) || existsSync(join(rootPath, 'build.gradle.kts'))) {\n const hasKotlin = existsSync(join(rootPath, 'build.gradle.kts'));\n stacks.push({ language: hasKotlin ? 'Kotlin' : 'Java', packageManager: 'gradle' });\n }\n\n return stacks;\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport { detectTechStack } from './tech-detector.js';\n\nexport type ProjectStatus = 'greenfield' | 'brownfield' | 'fork';\n\nexport interface ProjectScanResult {\n languages: Record<string, number>;\n frameworks: string[];\n packageManagers: string[];\n hasTests: boolean;\n testFrameworks: string[];\n hasCICD: boolean;\n cicdTools: string[];\n hasDocumentation: boolean;\n totalFiles: number;\n totalLines: number;\n status: ProjectStatus;\n rootPath: string;\n}\n\nconst LANGUAGE_MAP: Record<string, string> = {\n '.ts': 'TypeScript', '.tsx': 'TypeScript',\n '.js': 'JavaScript', '.jsx': 'JavaScript', '.mjs': 'JavaScript', '.cjs': 'JavaScript',\n '.py': 'Python',\n '.go': 'Go',\n '.rs': 'Rust',\n '.rb': 'Ruby',\n '.java': 'Java',\n '.kt': 'Kotlin',\n '.swift': 'Swift',\n '.c': 'C', '.h': 'C',\n '.cpp': 'C++', '.hpp': 'C++', '.cc': 'C++',\n '.cs': 'C#',\n '.php': 'PHP',\n '.vue': 'Vue',\n '.svelte': 'Svelte',\n};\n\nconst IGNORE_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'out', '.next', '.nuxt',\n 'target', '__pycache__', '.venv', 'venv', '.mod-bot', 'vendor',\n 'coverage', '.turbo', '.cache',\n]);\n\nconst TEST_DIRS = ['test', 'tests', '__tests__', 'spec', 'specs', '__test__'];\nconst TEST_PATTERNS = [/\\.test\\.[jt]sx?$/, /\\.spec\\.[jt]sx?$/, /test_.*\\.py$/, /_test\\.go$/];\n\nconst CI_FILES: Array<{ pattern: string; tool: string }> = [\n { pattern: '.github/workflows', tool: 'GitHub Actions' },\n { pattern: '.gitlab-ci.yml', tool: 'GitLab CI' },\n { pattern: 'Jenkinsfile', tool: 'Jenkins' },\n { pattern: '.circleci', tool: 'CircleCI' },\n { pattern: '.travis.yml', tool: 'Travis CI' },\n { pattern: 'bitbucket-pipelines.yml', tool: 'Bitbucket Pipelines' },\n];\n\nasync function countLines(filePath: string): Promise<number> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return content.split('\\n').length;\n } catch {\n return 0;\n }\n}\n\nasync function walkDir(\n dir: string,\n callback: (filePath: string, ext: string) => void,\n depth: number = 0,\n maxDepth: number = 8,\n): Promise<void> {\n if (depth > maxDepth) return;\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name.startsWith('.') && entry.isDirectory() && entry.name !== '.github') continue;\n if (IGNORE_DIRS.has(entry.name)) continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n await walkDir(fullPath, callback, depth + 1, maxDepth);\n } else if (entry.isFile()) {\n callback(fullPath, extname(entry.name));\n }\n }\n}\n\nasync function detectProjectStatus(rootPath: string): Promise<ProjectStatus> {\n // Check if it's a fork by inspecting git remotes\n if (existsSync(join(rootPath, '.git'))) {\n try {\n const { simpleGit } = await import('simple-git');\n const git = simpleGit(rootPath);\n const remotes = await git.getRemotes(true);\n const hasUpstream = remotes.some(r => r.name === 'upstream');\n if (hasUpstream) return 'fork';\n\n // Check commit count as a proxy for maturity\n const log = await git.log({ maxCount: 20 });\n if (log.total <= 3) return 'greenfield';\n } catch {\n // Git operations failed, continue with file-based detection\n }\n }\n\n // Check file count as a proxy\n let fileCount = 0;\n await walkDir(rootPath, () => { fileCount++; }, 0, 3);\n\n if (fileCount <= 10) return 'greenfield';\n return 'brownfield';\n}\n\nexport async function scanProject(rootPath: string): Promise<ProjectScanResult> {\n const languages: Record<string, number> = {};\n const allFiles: string[] = [];\n let totalLines = 0;\n let hasTests = false;\n\n await walkDir(rootPath, (filePath, ext) => {\n allFiles.push(filePath);\n const lang = LANGUAGE_MAP[ext];\n if (lang) {\n languages[lang] = (languages[lang] ?? 0) + 1;\n }\n // Check for test files\n if (TEST_PATTERNS.some(p => p.test(filePath))) {\n hasTests = true;\n }\n });\n\n // Check test directories\n if (!hasTests) {\n for (const dir of TEST_DIRS) {\n if (existsSync(join(rootPath, dir))) {\n hasTests = true;\n break;\n }\n }\n }\n\n // Count lines for a sample (first 50 source files to avoid long scan)\n const sourceFiles = allFiles.filter(f => Object.keys(LANGUAGE_MAP).includes(extname(f)));\n const sampleFiles = sourceFiles.slice(0, 50);\n for (const f of sampleFiles) {\n totalLines += await countLines(f);\n }\n if (sourceFiles.length > 50) {\n totalLines = Math.round(totalLines * (sourceFiles.length / 50));\n }\n\n // Detect CI/CD\n const cicdTools: string[] = [];\n for (const ci of CI_FILES) {\n if (existsSync(join(rootPath, ci.pattern))) {\n cicdTools.push(ci.tool);\n }\n }\n\n // Detect documentation\n const hasDocumentation = existsSync(join(rootPath, 'docs')) ||\n existsSync(join(rootPath, 'README.md')) ||\n existsSync(join(rootPath, 'doc'));\n\n // Detect tech stack\n const techStacks = await detectTechStack(rootPath);\n const frameworks = techStacks.map(t => t.framework).filter((f): f is string => !!f);\n const packageManagers = [...new Set(techStacks.map(t => t.packageManager).filter((p): p is string => !!p))];\n const testFrameworks = techStacks.map(t => t.testFramework).filter((t): t is string => !!t);\n\n const status = await detectProjectStatus(rootPath);\n\n return {\n languages,\n frameworks,\n packageManagers,\n hasTests,\n testFrameworks,\n hasCICD: cicdTools.length > 0,\n cicdTools,\n hasDocumentation,\n totalFiles: allFiles.length,\n totalLines,\n status,\n rootPath,\n };\n}\n","export type TaskComplexity = 'trivial' | 'simple' | 'moderate' | 'complex' | 'epic';\n\nexport interface ComplexityAssessment {\n level: TaskComplexity;\n score: number;\n factors: string[];\n estimatedTokens?: number;\n recommendSwarm: boolean;\n}\n\ninterface ComplexityFactor {\n name: string;\n weight: number;\n test: (description: string, context?: ComplexityContext) => boolean;\n}\n\nexport interface ComplexityContext {\n fileCount?: number;\n hasTests?: boolean;\n isNewFeature?: boolean;\n touchesMultipleModules?: boolean;\n involvesSecurity?: boolean;\n involvesDatabase?: boolean;\n}\n\nconst FACTORS: ComplexityFactor[] = [\n { name: 'Multi-file change', weight: 15, test: (d) => /\\b(multiple files?|across|several|many)\\b/i.test(d) },\n { name: 'New feature', weight: 20, test: (d) => /\\b(add|create|implement|build|new feature)\\b/i.test(d) },\n { name: 'Refactoring', weight: 15, test: (d) => /\\b(refactor|restructure|reorganize|migrate)\\b/i.test(d) },\n { name: 'Security-sensitive', weight: 25, test: (d) => /\\b(auth\\w*|security|encryption|token|credential|permission|rbac|oauth)\\b/i.test(d) },\n { name: 'Database changes', weight: 20, test: (d) => /\\b(database|schema|migration|model|table|query|sql)\\b/i.test(d) },\n { name: 'API changes', weight: 15, test: (d) => /\\b(api|endpoint|route|controller|graphql|rest)\\b/i.test(d) },\n { name: 'Testing required', weight: 10, test: (d) => /\\b(test|coverage|spec|assert)\\b/i.test(d) },\n { name: 'Performance-critical', weight: 20, test: (d) => /\\b(performance|optimize|speed|cache|latency)\\b/i.test(d) },\n { name: 'Cross-module', weight: 15, test: (_, c) => c?.touchesMultipleModules === true },\n { name: 'Large file count', weight: 10, test: (_, c) => (c?.fileCount ?? 0) > 5 },\n { name: 'Bug fix', weight: -10, test: (d) => /\\b(fix|bug|patch|hotfix|issue)\\b/i.test(d) },\n { name: 'Simple change', weight: -15, test: (d) => /\\b(typo|rename|update\\s+version|bump|comment|readme)\\b/i.test(d) },\n];\n\nfunction scoreToLevel(score: number): TaskComplexity {\n if (score <= 10) return 'trivial';\n if (score <= 25) return 'simple';\n if (score <= 50) return 'moderate';\n if (score <= 75) return 'complex';\n return 'epic';\n}\n\nconst TOKEN_ESTIMATES: Record<TaskComplexity, number> = {\n trivial: 500,\n simple: 2000,\n moderate: 8000,\n complex: 25000,\n epic: 80000,\n};\n\nexport function assessComplexity(\n description: string,\n context?: ComplexityContext,\n): ComplexityAssessment {\n let score = 20; // baseline\n const matchedFactors: string[] = [];\n\n for (const factor of FACTORS) {\n if (factor.test(description, context)) {\n score += factor.weight;\n matchedFactors.push(factor.name);\n }\n }\n\n score = Math.max(0, Math.min(100, score));\n const level = scoreToLevel(score);\n\n return {\n level,\n score,\n factors: matchedFactors,\n estimatedTokens: TOKEN_ESTIMATES[level],\n recommendSwarm: level === 'complex' || level === 'epic',\n };\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface GitState {\n isRepo: boolean;\n currentBranch: string;\n hasUncommittedChanges: boolean;\n stagedFiles: string[];\n modifiedFiles: string[];\n untrackedFiles: string[];\n aheadOfRemote: number;\n behindRemote: number;\n recentCommits: CommitInfo[];\n remotes: RemoteInfo[];\n}\n\nexport interface CommitInfo {\n hash: string;\n message: string;\n author: string;\n date: string;\n}\n\nexport interface RemoteInfo {\n name: string;\n url: string;\n}\n\nexport interface ChangesSinceLastSession {\n newFiles: string[];\n modifiedFiles: string[];\n deletedFiles: string[];\n newDependencies: string[];\n commitsSinceLastSession: CommitInfo[];\n}\n\nexport async function getGitState(rootPath: string): Promise<GitState> {\n const defaultState: GitState = {\n isRepo: false,\n currentBranch: '',\n hasUncommittedChanges: false,\n stagedFiles: [],\n modifiedFiles: [],\n untrackedFiles: [],\n aheadOfRemote: 0,\n behindRemote: 0,\n recentCommits: [],\n remotes: [],\n };\n\n if (!existsSync(join(rootPath, '.git'))) {\n return defaultState;\n }\n\n try {\n const { simpleGit } = await import('simple-git');\n const git = simpleGit(rootPath);\n\n const [status, logResult, remoteList] = await Promise.all([\n git.status(),\n git.log({ maxCount: 10 }).catch(() => ({ all: [] })),\n git.getRemotes(true).catch(() => []),\n ]);\n\n const recentCommits: CommitInfo[] = logResult.all.map(c => ({\n hash: c.hash.substring(0, 8),\n message: c.message,\n author: c.author_name,\n date: c.date,\n }));\n\n const remotes: RemoteInfo[] = remoteList.map(r => ({\n name: r.name,\n url: (r.refs.fetch || r.refs.push) ?? '',\n }));\n\n return {\n isRepo: true,\n currentBranch: status.current ?? 'unknown',\n hasUncommittedChanges: !status.isClean(),\n stagedFiles: status.staged,\n modifiedFiles: status.modified,\n untrackedFiles: status.not_added,\n aheadOfRemote: status.ahead,\n behindRemote: status.behind,\n recentCommits,\n remotes,\n };\n } catch {\n return { ...defaultState, isRepo: true };\n }\n}\n\nexport async function getChangesSince(\n rootPath: string,\n sinceDate: string,\n): Promise<ChangesSinceLastSession> {\n const result: ChangesSinceLastSession = {\n newFiles: [],\n modifiedFiles: [],\n deletedFiles: [],\n newDependencies: [],\n commitsSinceLastSession: [],\n };\n\n if (!existsSync(join(rootPath, '.git'))) return result;\n\n try {\n const { simpleGit } = await import('simple-git');\n const git = simpleGit(rootPath);\n\n const logResult = await git.log({ '--after': sinceDate, maxCount: 100 });\n result.commitsSinceLastSession = logResult.all.map(c => ({\n hash: c.hash.substring(0, 8),\n message: c.message,\n author: c.author_name,\n date: c.date,\n }));\n\n // Get diff stat since date\n if (result.commitsSinceLastSession.length > 0) {\n const oldestHash = result.commitsSinceLastSession[result.commitsSinceLastSession.length - 1]!.hash;\n const diffSummary = await git.diffSummary([`${oldestHash}~1..HEAD`]).catch(() => null);\n if (diffSummary) {\n for (const file of diffSummary.files) {\n if (file.binary) continue;\n // insertions > 0 && deletions = 0 → likely new file\n if ('insertions' in file && file.insertions > 0 && file.deletions === 0) {\n result.newFiles.push(file.file);\n } else if ('deletions' in file && file.deletions > 0 && file.insertions === 0) {\n result.deletedFiles.push(file.file);\n } else {\n result.modifiedFiles.push(file.file);\n }\n }\n }\n }\n } catch {\n // Git operations failed, return empty\n }\n\n return result;\n}\n","import { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nexport class FileStore<T> {\n private filePath: string;\n private defaultValue: T;\n\n constructor(filePath: string, defaultValue: T) {\n this.filePath = filePath;\n this.defaultValue = defaultValue;\n }\n\n async read(): Promise<T> {\n if (!existsSync(this.filePath)) {\n return structuredClone(this.defaultValue);\n }\n const raw = await readFile(this.filePath, 'utf-8');\n return JSON.parse(raw) as T;\n }\n\n async write(data: T): Promise<void> {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.filePath, JSON.stringify(data, null, 2), 'utf-8');\n }\n\n async update(updater: (current: T) => T): Promise<T> {\n const current = await this.read();\n const updated = updater(current);\n await this.write(updated);\n return updated;\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n}\n","import { join } from 'node:path';\nimport { FileStore } from './store.js';\n\nexport interface TechStack {\n language: string;\n framework?: string;\n packageManager?: string;\n testFramework?: string;\n buildTool?: string;\n}\n\nexport interface ProjectMemoryData {\n techStack: TechStack[];\n conventions: string[];\n knownIssues: string[];\n architecture: string;\n lastUpdated: string;\n}\n\nconst DEFAULT_PROJECT_MEMORY: ProjectMemoryData = {\n techStack: [],\n conventions: [],\n knownIssues: [],\n architecture: '',\n lastUpdated: new Date().toISOString(),\n};\n\nexport class ProjectMemory {\n private store: FileStore<ProjectMemoryData>;\n\n constructor(modBotDir: string) {\n this.store = new FileStore(join(modBotDir, 'memory', 'project.json'), DEFAULT_PROJECT_MEMORY);\n }\n\n async load(): Promise<ProjectMemoryData> {\n return this.store.read();\n }\n\n async save(data: ProjectMemoryData): Promise<void> {\n await this.store.write({ ...data, lastUpdated: new Date().toISOString() });\n }\n\n async setTechStack(stack: TechStack[]): Promise<void> {\n await this.store.update(d => ({ ...d, techStack: stack, lastUpdated: new Date().toISOString() }));\n }\n\n async addConvention(convention: string): Promise<void> {\n await this.store.update(d => ({\n ...d,\n conventions: [...d.conventions.filter(c => c !== convention), convention],\n lastUpdated: new Date().toISOString(),\n }));\n }\n\n async removeConvention(convention: string): Promise<void> {\n await this.store.update(d => ({\n ...d,\n conventions: d.conventions.filter(c => c !== convention),\n lastUpdated: new Date().toISOString(),\n }));\n }\n\n async addKnownIssue(issue: string): Promise<void> {\n await this.store.update(d => ({\n ...d,\n knownIssues: [...d.knownIssues, issue],\n lastUpdated: new Date().toISOString(),\n }));\n }\n\n async setArchitecture(description: string): Promise<void> {\n await this.store.update(d => ({ ...d, architecture: description, lastUpdated: new Date().toISOString() }));\n }\n}\n","import { join } from 'node:path';\nimport { FileStore } from './store.js';\n\nexport type PatternType = 'code_style' | 'workflow' | 'naming' | 'architecture' | 'testing' | 'preference';\n\nexport interface LearnedPattern {\n id: string;\n type: PatternType;\n description: string;\n confidence: number;\n occurrences: number;\n firstSeen: string;\n lastSeen: string;\n}\n\nexport interface IgnoredSuggestion {\n count: number;\n action: 'reduce_frequency' | 'suppress';\n}\n\nexport interface UserMemoryData {\n patterns: LearnedPattern[];\n ignoredSuggestions: Record<string, IgnoredSuggestion>;\n workflowPreferences: Record<string, boolean>;\n}\n\nconst DEFAULT_USER_MEMORY: UserMemoryData = {\n patterns: [],\n ignoredSuggestions: {},\n workflowPreferences: {},\n};\n\nexport class UserMemory {\n private store: FileStore<UserMemoryData>;\n\n constructor(modBotDir: string) {\n this.store = new FileStore(join(modBotDir, 'memory', 'user.json'), DEFAULT_USER_MEMORY);\n }\n\n async load(): Promise<UserMemoryData> {\n return this.store.read();\n }\n\n async save(data: UserMemoryData): Promise<void> {\n await this.store.write(data);\n }\n\n async addPattern(pattern: Omit<LearnedPattern, 'occurrences' | 'firstSeen' | 'lastSeen'>): Promise<LearnedPattern> {\n const data = await this.store.read();\n const existing = data.patterns.find(p => p.id === pattern.id);\n const now = new Date().toISOString();\n\n if (existing) {\n existing.occurrences += 1;\n existing.lastSeen = now;\n existing.confidence = Math.min(1, existing.confidence + 0.05);\n existing.description = pattern.description;\n await this.store.write(data);\n return existing;\n }\n\n const newPattern: LearnedPattern = {\n ...pattern,\n occurrences: 1,\n firstSeen: now,\n lastSeen: now,\n };\n data.patterns.push(newPattern);\n await this.store.write(data);\n return newPattern;\n }\n\n async removePattern(id: string): Promise<boolean> {\n const data = await this.store.read();\n const before = data.patterns.length;\n data.patterns = data.patterns.filter(p => p.id !== id);\n if (data.patterns.length < before) {\n await this.store.write(data);\n return true;\n }\n return false;\n }\n\n async getPatterns(): Promise<LearnedPattern[]> {\n const data = await this.store.read();\n return data.patterns;\n }\n\n async recordIgnoredSuggestion(key: string): Promise<void> {\n await this.store.update(d => {\n const existing = d.ignoredSuggestions[key];\n const count = (existing?.count ?? 0) + 1;\n const action = count >= 5 ? 'suppress' as const : 'reduce_frequency' as const;\n return {\n ...d,\n ignoredSuggestions: {\n ...d.ignoredSuggestions,\n [key]: { count, action },\n },\n };\n });\n }\n\n async setWorkflowPreference(key: string, value: boolean): Promise<void> {\n await this.store.update(d => ({\n ...d,\n workflowPreferences: { ...d.workflowPreferences, [key]: value },\n }));\n }\n\n async resetAll(): Promise<void> {\n await this.store.write(structuredClone(DEFAULT_USER_MEMORY));\n }\n\n async resetPatterns(): Promise<void> {\n await this.store.update(d => ({ ...d, patterns: [] }));\n }\n}\n","import { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { FileStore } from './store.js';\n\nexport interface DecisionEntry {\n id: string;\n description: string;\n rationale: string;\n timestamp: string;\n category: string;\n}\n\nexport interface SessionEntry {\n id: string;\n startedAt: string;\n endedAt?: string;\n task: string;\n decisions: DecisionEntry[];\n summary?: string;\n}\n\nexport interface SessionMemoryData {\n sessions: SessionEntry[];\n}\n\nconst DEFAULT_SESSION_MEMORY: SessionMemoryData = { sessions: [] };\n\nexport class SessionMemory {\n private store: FileStore<SessionMemoryData>;\n private currentSessionId: string | null = null;\n\n constructor(modBotDir: string) {\n this.store = new FileStore(join(modBotDir, 'memory', 'sessions.json'), DEFAULT_SESSION_MEMORY);\n }\n\n async load(): Promise<SessionMemoryData> {\n return this.store.read();\n }\n\n async startSession(task: string): Promise<string> {\n const id = randomUUID();\n this.currentSessionId = id;\n const entry: SessionEntry = {\n id,\n startedAt: new Date().toISOString(),\n task,\n decisions: [],\n };\n await this.store.update(d => ({\n sessions: [...d.sessions, entry],\n }));\n return id;\n }\n\n async endSession(summary?: string): Promise<void> {\n if (!this.currentSessionId) return;\n const sessionId = this.currentSessionId;\n this.currentSessionId = null;\n await this.store.update(d => ({\n sessions: d.sessions.map(s =>\n s.id === sessionId\n ? { ...s, endedAt: new Date().toISOString(), summary }\n : s,\n ),\n }));\n }\n\n async addDecision(description: string, rationale: string, category: string): Promise<void> {\n if (!this.currentSessionId) return;\n const sessionId = this.currentSessionId;\n const decision: DecisionEntry = {\n id: randomUUID(),\n description,\n rationale,\n timestamp: new Date().toISOString(),\n category,\n };\n await this.store.update(d => ({\n sessions: d.sessions.map(s =>\n s.id === sessionId\n ? { ...s, decisions: [...s.decisions, decision] }\n : s,\n ),\n }));\n }\n\n async getRecentSessions(limit: number = 10): Promise<SessionEntry[]> {\n const data = await this.store.read();\n return data.sessions.slice(-limit);\n }\n\n async getSession(id: string): Promise<SessionEntry | undefined> {\n const data = await this.store.read();\n return data.sessions.find(s => s.id === id);\n }\n\n getCurrentSessionId(): string | null {\n return this.currentSessionId;\n }\n}\n","import type { LearnedPattern, PatternType } from './user-memory.js';\nimport { UserMemory } from './user-memory.js';\n\nexport interface DetectedPattern {\n id: string;\n type: PatternType;\n description: string;\n confidence: number;\n}\n\nexport class PatternDetector {\n private userMemory: UserMemory;\n private recentActions: Array<{ action: string; timestamp: number }> = [];\n\n constructor(userMemory: UserMemory) {\n this.userMemory = userMemory;\n }\n\n recordAction(action: string): void {\n this.recentActions.push({ action, timestamp: Date.now() });\n // Keep last 100 actions\n if (this.recentActions.length > 100) {\n this.recentActions = this.recentActions.slice(-100);\n }\n }\n\n async detectPatterns(): Promise<DetectedPattern[]> {\n const detected: DetectedPattern[] = [];\n const actionCounts = new Map<string, number>();\n\n for (const { action } of this.recentActions) {\n actionCounts.set(action, (actionCounts.get(action) ?? 0) + 1);\n }\n\n // Detect repeated actions (3+ occurrences = pattern)\n for (const [action, count] of actionCounts) {\n if (count >= 3) {\n const confidence = Math.min(1, count / 10);\n detected.push({\n id: `auto-${action.toLowerCase().replace(/\\s+/g, '-')}`,\n type: 'preference',\n description: `User frequently: ${action}`,\n confidence,\n });\n }\n }\n\n return detected;\n }\n\n async learnPattern(id: string, type: PatternType, description: string, confidence: number = 0.5): Promise<LearnedPattern> {\n return this.userMemory.addPattern({ id, type, description, confidence });\n }\n\n async suggestWorkflowAdjustments(): Promise<string[]> {\n const patterns = await this.userMemory.getPatterns();\n const suggestions: string[] = [];\n\n // Check for patterns that suggest workflow changes\n const skipReviewPattern = patterns.find(p => p.id.includes('skip-review'));\n if (skipReviewPattern && skipReviewPattern.occurrences >= 5) {\n suggestions.push(\n `You've skipped reviews ${skipReviewPattern.occurrences} times. Want me to auto-approve changes under 10 lines?`,\n );\n }\n\n const tddPattern = patterns.find(p => p.id.includes('tdd') || p.id.includes('test-first'));\n if (tddPattern && tddPattern.confidence > 0.7) {\n suggestions.push(\n 'You consistently write tests before implementation. Want me to enforce TDD for new features?',\n );\n }\n\n const directImplPattern = patterns.find(p => p.id.includes('direct-impl') || p.id.includes('skip-plan'));\n if (directImplPattern && directImplPattern.confidence > 0.6) {\n suggestions.push(\n 'You often skip planning for simple tasks. Want me to only suggest plans for complex tasks?',\n );\n }\n\n return suggestions;\n }\n\n clearRecentActions(): void {\n this.recentActions = [];\n }\n}\n","/**\n * Moderation Tools — Core moderation capabilities\n *\n * Tools:\n * - mod:suggest — Suggest optimal approach for a task\n * - mod:review — Review staged changes\n * - mod:plan — Create an implementation plan\n * - mod:checkpoint — Create a workflow checkpoint\n * - mod:retro — Run a retrospective\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadConfig,\n isInitialized,\n Moderator,\n loadProjectState,\n updateProjectState,\n setTask,\n addDecision,\n} from '@mod-bot/core';\nimport type { ModeratorContext } from '@mod-bot/core';\nimport { UserMemory } from '@mod-bot/memory';\nimport { assessComplexity } from '@mod-bot/analyzer';\nimport type { ComplexityContext } from '@mod-bot/analyzer';\n\nfunction getProjectRoot(): string {\n return process.cwd();\n}\n\nasync function getModerator(): Promise<Moderator | null> {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) return null;\n\n const config = await loadConfig(projectRoot);\n const projectState = await loadProjectState(projectRoot);\n const userMemory = new UserMemory(projectRoot + '/.mod-bot');\n const userMemoryData = await userMemory.load();\n\n const ctx: ModeratorContext = {\n config,\n projectState,\n userMemory: userMemoryData,\n projectRoot,\n };\n\n return new Moderator(ctx);\n}\n\nexport function registerModerateTools(server: McpServer): void {\n // mod:suggest — Suggest approach for a task\n server.tool(\n 'mod_suggest',\n 'Get a suggestion for how to approach a task, adapted to your experience level.',\n {\n task: z.string().describe('Description of the task'),\n fileCount: z.number().optional().describe('Number of files involved'),\n isNewFeature: z.boolean().optional().describe('Is this a new feature?'),\n touchesMultipleModules: z.boolean().optional().describe('Does this touch multiple modules?'),\n },\n async (args) => {\n const moderator = await getModerator();\n if (!moderator) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const context: ComplexityContext = {\n fileCount: args.fileCount,\n isNewFeature: args.isNewFeature,\n touchesMultipleModules: args.touchesMultipleModules,\n };\n const complexity = assessComplexity(args.task, context);\n const result = moderator.suggest(args.task, complexity);\n\n // Track the task\n const projectRoot = getProjectRoot();\n await updateProjectState(projectRoot, s => setTask(s, args.task));\n\n return { content: [{ type: 'text' as const, text: result.content }] };\n },\n );\n\n // mod:review — Review staged changes\n server.tool(\n 'mod_review',\n 'Review code changes before committing. Checks for issues adapted to your level.',\n {\n changes: z.string().describe('The diff or description of changes to review'),\n context: z.string().optional().describe('Additional context about what was changed'),\n },\n async (args) => {\n const moderator = await getModerator();\n if (!moderator) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const result = moderator.review(args.changes, args.context);\n return { content: [{ type: 'text' as const, text: result.content }] };\n },\n );\n\n // mod:plan — Create an implementation plan\n server.tool(\n 'mod_plan',\n 'Create a moderated implementation plan adapted to your experience level.',\n {\n task: z.string().describe('Description of what to implement'),\n fileCount: z.number().optional().describe('Estimated number of files involved'),\n },\n async (args) => {\n const moderator = await getModerator();\n if (!moderator) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const complexity = assessComplexity(args.task, { fileCount: args.fileCount });\n const result = moderator.plan(args.task, complexity);\n\n return { content: [{ type: 'text' as const, text: result.content }] };\n },\n );\n\n // mod:checkpoint — Create a workflow checkpoint\n server.tool(\n 'mod_checkpoint',\n 'Create a checkpoint summarizing current progress, decisions, and open questions.',\n {\n note: z.string().optional().describe('Additional note to include in the checkpoint'),\n },\n async (args) => {\n const moderator = await getModerator();\n if (!moderator) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const result = moderator.checkpoint();\n let text = result.content;\n if (args.note) {\n text += `\\n\\n**Note:** ${args.note}`;\n }\n\n return { content: [{ type: 'text' as const, text }] };\n },\n );\n\n // mod:retro — Retrospective\n server.tool(\n 'mod_retro',\n 'Run a brief retrospective after completing a task.',\n {\n task: z.string().describe('Summary of what was accomplished'),\n decision: z.string().optional().describe('Key decision made during the task'),\n decisionRationale: z.string().optional().describe('Why that decision was made'),\n },\n async (args) => {\n const moderator = await getModerator();\n if (!moderator) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n // Record decision if provided\n if (args.decision && args.decisionRationale) {\n const projectRoot = getProjectRoot();\n await updateProjectState(projectRoot, s =>\n addDecision(s, args.decision!, args.decisionRationale!, 'implementation'),\n );\n }\n\n const result = moderator.retro(args.task);\n return { content: [{ type: 'text' as const, text: result.content }] };\n },\n );\n}\n","/**\n * Context Management Tools\n *\n * Tools:\n * - ctx:status — Show current project state\n * - ctx:refresh — Force full context refresh\n * - ctx:focus — Set current focus area\n * - ctx:history — Show session history\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport {\n loadConfig,\n isInitialized,\n loadProjectState,\n updateProjectState,\n setFocus,\n} from '@mod-bot/core';\nimport { getGitState, scanProject } from '@mod-bot/analyzer';\nimport { SessionMemory } from '@mod-bot/memory';\n\nfunction getProjectRoot(): string {\n return process.cwd();\n}\n\nexport function registerContextTools(server: McpServer): void {\n // ctx:status — Show current state\n server.tool(\n 'ctx_status',\n 'Show the current project status: branch, task, recent changes, focus area, and health.',\n {},\n async () => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const [config, state, gitState] = await Promise.all([\n loadConfig(projectRoot),\n loadProjectState(projectRoot),\n getGitState(projectRoot),\n ]);\n\n const lines = [\n `# Project Status`,\n ``,\n `## Git`,\n `- **Branch:** ${gitState.currentBranch || state.currentBranch}`,\n `- **Uncommitted changes:** ${gitState.hasUncommittedChanges ? 'Yes' : 'No'}`,\n ];\n\n if (gitState.stagedFiles.length > 0) {\n lines.push(`- **Staged:** ${gitState.stagedFiles.length} files`);\n }\n if (gitState.modifiedFiles.length > 0) {\n lines.push(`- **Modified:** ${gitState.modifiedFiles.length} files`);\n }\n if (gitState.aheadOfRemote > 0) {\n lines.push(`- **Ahead of remote:** ${gitState.aheadOfRemote} commits`);\n }\n if (gitState.behindRemote > 0) {\n lines.push(`- **Behind remote:** ${gitState.behindRemote} commits`);\n }\n\n lines.push(``);\n lines.push(`## Mod-Bot`);\n lines.push(`- **User Level:** ${config.user.experienceLevel}`);\n\n if (state.currentTask) {\n lines.push(`- **Current Task:** ${state.currentTask}`);\n }\n if (state.focusArea) {\n lines.push(`- **Focus Area:** ${state.focusArea}`);\n }\n\n if (state.openQuestions.length > 0) {\n lines.push(``, `## Open Questions`);\n for (const q of state.openQuestions) {\n lines.push(`- ${q}`);\n }\n }\n\n if (state.healthMetrics.buildPassing !== undefined) {\n lines.push(``, `## Health`);\n lines.push(`- **Build:** ${state.healthMetrics.buildPassing ? 'Passing' : 'Failing'}`);\n if (state.healthMetrics.testPassRate !== undefined) {\n lines.push(`- **Test Pass Rate:** ${(state.healthMetrics.testPassRate * 100).toFixed(0)}%`);\n }\n if (state.healthMetrics.lintErrorCount !== undefined) {\n lines.push(`- **Lint Errors:** ${state.healthMetrics.lintErrorCount}`);\n }\n }\n\n if (gitState.recentCommits.length > 0) {\n lines.push(``, `## Recent Commits`);\n for (const c of gitState.recentCommits.slice(0, 5)) {\n lines.push(`- \\`${c.hash}\\` ${c.message}`);\n }\n }\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n\n // ctx:refresh — Force re-scan\n server.tool(\n 'ctx_refresh',\n 'Force a full context refresh: re-scan the codebase and update the knowledge graph.',\n {},\n async () => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const [scanResult, gitState] = await Promise.all([\n scanProject(projectRoot),\n getGitState(projectRoot),\n ]);\n\n await updateProjectState(projectRoot, s => ({\n ...s,\n lastScanAt: new Date().toISOString(),\n currentBranch: gitState.currentBranch || s.currentBranch,\n }));\n\n const lines = [\n `Context refreshed.`,\n `- **Files:** ${scanResult.totalFiles}`,\n `- **Languages:** ${Object.keys(scanResult.languages).join(', ')}`,\n `- **Branch:** ${gitState.currentBranch}`,\n `- **Uncommitted:** ${gitState.hasUncommittedChanges ? 'Yes' : 'No'}`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n\n // ctx:focus — Set focus area\n server.tool(\n 'ctx_focus',\n 'Set the current focus area so mod-bot prioritizes context from this area.',\n {\n area: z.string().describe('The focus area (e.g., \"authentication module\", \"API endpoints\")'),\n },\n async (args) => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n await updateProjectState(projectRoot, s => setFocus(s, args.area));\n\n return {\n content: [{ type: 'text' as const, text: `Focus set to: **${args.area}**` }],\n };\n },\n );\n\n // ctx:history — Show session history\n server.tool(\n 'ctx_history',\n 'Show the session history and decision log for the current project.',\n {\n limit: z.number().optional().describe('Number of sessions to show (default: 10)'),\n },\n async (args) => {\n const projectRoot = getProjectRoot();\n if (!isInitialized(projectRoot)) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const sessionMemory = new SessionMemory(projectRoot + '/.mod-bot');\n const sessions = await sessionMemory.getRecentSessions(args.limit ?? 10);\n const state = await loadProjectState(projectRoot);\n\n const lines = [`# Session History`, ``];\n\n if (sessions.length === 0) {\n lines.push('No sessions recorded yet.');\n } else {\n for (const session of sessions.reverse()) {\n const status = session.endedAt ? 'completed' : 'in progress';\n lines.push(`## ${session.task}`);\n lines.push(`- **Started:** ${session.startedAt}`);\n lines.push(`- **Status:** ${status}`);\n if (session.summary) {\n lines.push(`- **Summary:** ${session.summary}`);\n }\n if (session.decisions.length > 0) {\n lines.push(`- **Decisions:** ${session.decisions.length}`);\n }\n lines.push(``);\n }\n }\n\n if (state.decisions.length > 0) {\n lines.push(`# Decision Log`, ``);\n for (const d of state.decisions.slice(-10)) {\n lines.push(`- **${d.description}** — ${d.rationale} _(${d.timestamp})_`);\n }\n }\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n}\n","/**\n * Learning & Adaptation Tools\n *\n * Tools:\n * - learn:pattern — Teach mod-bot a pattern or preference\n * - learn:show — Show what mod-bot has learned\n * - learn:reset — Reset specific learned patterns\n * - learn:suggest-workflow — Suggest workflow adjustments\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { isInitialized } from '@mod-bot/core';\nimport { UserMemory, PatternDetector } from '@mod-bot/memory';\nimport type { PatternType } from '@mod-bot/memory';\n\nfunction getProjectRoot(): string {\n return process.cwd();\n}\n\nfunction getModBotDir(): string {\n return getProjectRoot() + '/.mod-bot';\n}\n\nexport function registerLearnTools(server: McpServer): void {\n // learn:pattern — Teach a pattern\n server.tool(\n 'learn_pattern',\n 'Teach mod-bot a coding pattern or preference (e.g., \"I always use early returns\").',\n {\n id: z.string().describe('A short identifier for the pattern (e.g., \"early-returns\")'),\n type: z.enum(['code_style', 'workflow', 'naming', 'architecture', 'testing', 'preference']).describe('Pattern category'),\n description: z.string().describe('Description of the pattern or preference'),\n confidence: z.number().min(0).max(1).optional().describe('How confident you are (0-1, default: 0.8)'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const userMemory = new UserMemory(getModBotDir());\n const pattern = await userMemory.addPattern({\n id: args.id,\n type: args.type as PatternType,\n description: args.description,\n confidence: args.confidence ?? 0.8,\n });\n\n return {\n content: [{\n type: 'text' as const,\n text: `Pattern learned: **${pattern.id}** (${pattern.type})\\n${pattern.description}\\nConfidence: ${(pattern.confidence * 100).toFixed(0)}% | Occurrences: ${pattern.occurrences}`,\n }],\n };\n },\n );\n\n // learn:show — Show learned patterns\n server.tool(\n 'learn_show',\n 'Show what mod-bot has learned about you and your project.',\n {\n type: z.enum(['code_style', 'workflow', 'naming', 'architecture', 'testing', 'preference', 'all']).optional().describe('Filter by pattern type'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const userMemory = new UserMemory(getModBotDir());\n const data = await userMemory.load();\n\n let patterns = data.patterns;\n if (args.type && args.type !== 'all') {\n patterns = patterns.filter(p => p.type === args.type);\n }\n\n const lines = [`# Learned Patterns`, ``];\n\n if (patterns.length === 0) {\n lines.push('No patterns learned yet. Use `learn:pattern` to teach me your preferences.');\n } else {\n // Group by type\n const grouped = new Map<string, typeof patterns>();\n for (const p of patterns) {\n const group = grouped.get(p.type) ?? [];\n group.push(p);\n grouped.set(p.type, group);\n }\n\n for (const [type, group] of grouped) {\n lines.push(`## ${type}`);\n for (const p of group) {\n lines.push(`- **${p.id}**: ${p.description}`);\n lines.push(` Confidence: ${(p.confidence * 100).toFixed(0)}% | Seen ${p.occurrences}x | Last: ${p.lastSeen}`);\n }\n lines.push(``);\n }\n }\n\n const ignoredCount = Object.keys(data.ignoredSuggestions).length;\n if (ignoredCount > 0) {\n lines.push(`## Suppressed Suggestions`);\n for (const [key, value] of Object.entries(data.ignoredSuggestions)) {\n lines.push(`- **${key}**: ignored ${value.count}x (${value.action})`);\n }\n lines.push(``);\n }\n\n const prefCount = Object.keys(data.workflowPreferences).length;\n if (prefCount > 0) {\n lines.push(`## Workflow Preferences`);\n for (const [key, value] of Object.entries(data.workflowPreferences)) {\n lines.push(`- ${key}: ${value ? 'enabled' : 'disabled'}`);\n }\n }\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n\n // learn:reset — Reset patterns\n server.tool(\n 'learn_reset',\n 'Reset specific learned patterns or all learned data.',\n {\n patternId: z.string().optional().describe('ID of a specific pattern to remove'),\n resetAll: z.boolean().optional().describe('Reset all learned patterns (default: false)'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const userMemory = new UserMemory(getModBotDir());\n\n if (args.resetAll) {\n await userMemory.resetAll();\n return {\n content: [{ type: 'text' as const, text: 'All learned patterns have been reset.' }],\n };\n }\n\n if (args.patternId) {\n const removed = await userMemory.removePattern(args.patternId);\n if (removed) {\n return {\n content: [{ type: 'text' as const, text: `Pattern \"${args.patternId}\" removed.` }],\n };\n }\n return {\n content: [{ type: 'text' as const, text: `Pattern \"${args.patternId}\" not found.` }],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: 'Specify a patternId to remove or set resetAll to true.' }],\n isError: true,\n };\n },\n );\n\n // learn:suggest-workflow — Suggest workflow adjustments\n server.tool(\n 'learn_suggest-workflow',\n 'Get workflow adjustment suggestions based on your accumulated patterns.',\n {},\n async () => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const userMemory = new UserMemory(getModBotDir());\n const detector = new PatternDetector(userMemory);\n const suggestions = await detector.suggestWorkflowAdjustments();\n\n if (suggestions.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: 'No workflow suggestions yet. Keep using mod-bot and I\\'ll learn your patterns over time.',\n }],\n };\n }\n\n const lines = [\n `# Workflow Suggestions`,\n ``,\n `Based on your usage patterns:`,\n ``,\n ...suggestions.map(s => `- ${s}`),\n ``,\n `Use \\`init:reconfig\\` to apply any of these suggestions.`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n}\n","/**\n * Selective Swarm Tools\n *\n * Token-conscious multi-agent dispatch. Only used when task complexity warrants it.\n *\n * Tools:\n * - swarm:analyze — Spawn a focused analysis swarm\n * - swarm:refactor — Coordinated multi-file refactoring\n * - swarm:estimate — Estimate token cost before spawning\n */\n\nimport { z } from 'zod';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { loadConfig, isInitialized } from '@mod-bot/core';\nimport { assessComplexity } from '@mod-bot/analyzer';\n\nfunction getProjectRoot(): string {\n return process.cwd();\n}\n\n// Token cost estimates per agent\nconst TOKENS_PER_AGENT = 5000;\nconst COST_PER_1K_TOKENS = 0.003; // Approximate cost\n\ninterface SwarmEstimate {\n agentCount: number;\n estimatedTokens: number;\n estimatedCostUsd: number;\n tasks: string[];\n withinBudget: boolean;\n}\n\nfunction estimateSwarm(_taskDescription: string, agentCount: number, budget: string): SwarmEstimate {\n const estimatedTokens = agentCount * TOKENS_PER_AGENT;\n const estimatedCostUsd = (estimatedTokens / 1000) * COST_PER_1K_TOKENS;\n\n const budgetLimits: Record<string, number> = {\n conservative: 0.05,\n moderate: 0.25,\n unlimited: Infinity,\n };\n const limit = budgetLimits[budget] ?? 0.05;\n\n return {\n agentCount,\n estimatedTokens,\n estimatedCostUsd,\n tasks: [],\n withinBudget: estimatedCostUsd <= limit,\n };\n}\n\nexport function registerSwarmTools(server: McpServer): void {\n // swarm:estimate — Estimate cost before spawning\n server.tool(\n 'swarm_estimate',\n 'Estimate the token cost of a multi-agent swarm before spawning it.',\n {\n task: z.string().describe('Description of the task'),\n agentCount: z.number().min(2).max(8).optional().describe('Number of agents (default: auto-determined)'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const config = await loadConfig(getProjectRoot());\n const complexity = assessComplexity(args.task);\n\n const agentCount = args.agentCount ?? (complexity.level === 'epic' ? 6 : complexity.level === 'complex' ? 4 : 3);\n const estimate = estimateSwarm(args.task, agentCount, config.moderation.swarmBudget);\n\n const lines = [\n `## Swarm Estimate`,\n ``,\n `- **Task Complexity:** ${complexity.level} (${complexity.score}/100)`,\n `- **Agents:** ${estimate.agentCount}`,\n `- **Estimated Tokens:** ~${estimate.estimatedTokens.toLocaleString()}`,\n `- **Estimated Cost:** $${estimate.estimatedCostUsd.toFixed(4)}`,\n `- **Budget:** ${config.moderation.swarmBudget}`,\n `- **Within Budget:** ${estimate.withinBudget ? 'Yes' : 'No — increase budget with `init:reconfig`'}`,\n ];\n\n if (!estimate.withinBudget) {\n lines.push(``, `> The estimated cost exceeds your ${config.moderation.swarmBudget} budget. Consider:`, `> - Reducing agent count`, `> - Increasing budget via \\`init:reconfig\\``, `> - Breaking the task into smaller pieces`);\n }\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n\n // swarm:analyze — Focused analysis swarm\n server.tool(\n 'swarm_analyze',\n 'Spawn a focused analysis swarm for complex tasks. One agent reads code, one checks tests, one reviews architecture.',\n {\n task: z.string().describe('What to analyze'),\n files: z.array(z.string()).optional().describe('Specific files to focus on'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const config = await loadConfig(getProjectRoot());\n const complexity = assessComplexity(args.task);\n\n if (!complexity.recommendSwarm) {\n return {\n content: [{\n type: 'text' as const,\n text: `Task complexity is ${complexity.level} (${complexity.score}/100). A swarm is not recommended for this task — direct analysis should suffice.`,\n }],\n };\n }\n\n const estimate = estimateSwarm(args.task, 3, config.moderation.swarmBudget);\n if (!estimate.withinBudget) {\n return {\n content: [{\n type: 'text' as const,\n text: `Swarm cost ($${estimate.estimatedCostUsd.toFixed(4)}) exceeds ${config.moderation.swarmBudget} budget. Use \\`swarm:estimate\\` for details or increase budget.`,\n }],\n };\n }\n\n // Build swarm task descriptions\n const agents = [\n { role: 'Code Analyst', task: `Analyze the code structure and logic for: ${args.task}` },\n { role: 'Test Reviewer', task: `Check test coverage and test quality for: ${args.task}` },\n { role: 'Architecture Reviewer', task: `Review architectural implications of: ${args.task}` },\n ];\n\n const fileContext = args.files?.length\n ? `\\nFocus files: ${args.files.join(', ')}`\n : '';\n\n const lines = [\n `## Analysis Swarm Ready`,\n ``,\n `**Task:** ${args.task}${fileContext}`,\n `**Complexity:** ${complexity.level} (${complexity.score}/100)`,\n `**Estimated Cost:** $${estimate.estimatedCostUsd.toFixed(4)}`,\n ``,\n `### Agent Tasks`,\n ``,\n ...agents.map((a, i) => `${i + 1}. **${a.role}:** ${a.task}`),\n ``,\n `> Dispatch these as parallel subagents for best results.`,\n `> Each agent should return its findings, and the moderator will synthesize.`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n\n // swarm:refactor — Multi-file refactoring coordination\n server.tool(\n 'swarm_refactor',\n 'Coordinate a multi-file refactoring with one agent per concern.',\n {\n description: z.string().describe('What to refactor'),\n files: z.array(z.string()).describe('Files involved in the refactoring'),\n concerns: z.array(z.string()).optional().describe('Specific concerns to address (e.g., rename, move, update-imports)'),\n },\n async (args) => {\n if (!isInitialized(getProjectRoot())) {\n return {\n content: [{ type: 'text' as const, text: 'Mod-bot is not initialized. Run `init:setup` first.' }],\n isError: true,\n };\n }\n\n const config = await loadConfig(getProjectRoot());\n const concerns = args.concerns ?? ['rename', 'update-imports', 'update-tests'];\n const estimate = estimateSwarm(args.description, concerns.length, config.moderation.swarmBudget);\n\n if (!estimate.withinBudget) {\n return {\n content: [{\n type: 'text' as const,\n text: `Refactoring swarm cost ($${estimate.estimatedCostUsd.toFixed(4)}) exceeds budget. Consider reducing scope or increasing budget.`,\n }],\n };\n }\n\n const agents = concerns.map(concern => ({\n role: concern,\n files: args.files,\n task: `Handle the \"${concern}\" aspect of: ${args.description}`,\n }));\n\n const lines = [\n `## Refactoring Swarm Plan`,\n ``,\n `**Description:** ${args.description}`,\n `**Files:** ${args.files.join(', ')}`,\n `**Estimated Cost:** $${estimate.estimatedCostUsd.toFixed(4)}`,\n ``,\n `### Agent Assignments`,\n ``,\n ...agents.map((a, i) => `${i + 1}. **${a.role}:** ${a.task}\\n Files: ${a.files.join(', ')}`),\n ``,\n `> Each agent works in isolation on its concern.`,\n `> After all agents complete, review and merge the changes.`,\n ];\n\n return { content: [{ type: 'text' as const, text: lines.join('\\n') }] };\n },\n );\n}\n"],"mappings":"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","names":["z","readFile","writeFile","existsSync","join","join","existsSync","readFile","writeFile","existsSync","readFile","join","readFile","existsSync","join","readFile","join","existsSync","existsSync","join","defaultState","readFile","writeFile","mkdir","existsSync","join","join","join","join","join","randomUUID","join","randomUUID","server","z","z","getProjectRoot","server","z","z","getProjectRoot","server","z","z","getProjectRoot","getModBotDir","server","z","z","getProjectRoot","server","z"]}
@@ -0,0 +1,94 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft-07/schema#",
3
+ "title": "Mod-Bot Configuration",
4
+ "description": "Configuration schema for mod-bot code moderation MCP server",
5
+ "type": "object",
6
+ "properties": {
7
+ "version": {
8
+ "type": "string",
9
+ "description": "Config schema version",
10
+ "default": "1.0.0"
11
+ },
12
+ "user": {
13
+ "type": "object",
14
+ "description": "User profile and preferences",
15
+ "properties": {
16
+ "name": { "type": "string", "default": "" },
17
+ "experienceLevel": {
18
+ "type": "string",
19
+ "enum": ["junior", "mid", "senior", "lead"],
20
+ "default": "mid"
21
+ },
22
+ "primaryLanguages": {
23
+ "type": "array",
24
+ "items": { "type": "string" },
25
+ "default": []
26
+ },
27
+ "learningLanguages": {
28
+ "type": "array",
29
+ "items": { "type": "string" },
30
+ "default": []
31
+ },
32
+ "visualPreference": {
33
+ "type": "string",
34
+ "enum": ["minimal", "moderate", "verbose"],
35
+ "default": "moderate"
36
+ },
37
+ "explanationDepth": {
38
+ "type": "string",
39
+ "enum": ["terse", "standard", "detailed"],
40
+ "default": "standard"
41
+ },
42
+ "workflowPreference": {
43
+ "type": "string",
44
+ "enum": ["guided", "autonomous", "adaptive"],
45
+ "default": "adaptive"
46
+ }
47
+ },
48
+ "additionalProperties": false
49
+ },
50
+ "project": {
51
+ "type": "object",
52
+ "description": "Project configuration",
53
+ "properties": {
54
+ "status": {
55
+ "type": "string",
56
+ "enum": ["greenfield", "brownfield", "fork"],
57
+ "default": "brownfield"
58
+ },
59
+ "type": {
60
+ "type": "string",
61
+ "enum": ["personal", "team", "enterprise"],
62
+ "default": "personal"
63
+ },
64
+ "priorities": {
65
+ "type": "array",
66
+ "items": { "type": "string" },
67
+ "default": ["quality"]
68
+ }
69
+ },
70
+ "additionalProperties": false
71
+ },
72
+ "moderation": {
73
+ "type": "object",
74
+ "description": "Moderation behavior configuration",
75
+ "properties": {
76
+ "autoSuggest": { "type": "boolean", "default": true },
77
+ "learnPatterns": { "type": "boolean", "default": true },
78
+ "swarmBudget": {
79
+ "type": "string",
80
+ "enum": ["conservative", "moderate", "unlimited"],
81
+ "default": "conservative"
82
+ },
83
+ "tddEnforcement": {
84
+ "type": "string",
85
+ "enum": ["off", "suggest", "enforce"],
86
+ "default": "suggest"
87
+ },
88
+ "reviewBeforeCommit": { "type": "boolean", "default": true }
89
+ },
90
+ "additionalProperties": false
91
+ }
92
+ },
93
+ "additionalProperties": false
94
+ }
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "mod-bot",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Adaptive code moderation MCP server that learns your preferences and tailors guidance to your experience level",
6
+ "author": "Miguel Seglias",
7
+ "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/MiguelSeglias/mod-bot.git"
11
+ },
12
+ "keywords": [
13
+ "mcp",
14
+ "moderation",
15
+ "code-review",
16
+ "adaptive",
17
+ "claude-code"
18
+ ],
19
+ "bin": {
20
+ "mod-bot": "dist/index.js"
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "mod-bot.config.schema.json",
25
+ "agents",
26
+ "README.md"
27
+ ],
28
+ "packageManager": "pnpm@10.8.1",
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "scripts": {
33
+ "build": "pnpm -r build",
34
+ "build:dist": "tsup",
35
+ "prepublishOnly": "pnpm build && pnpm build:dist",
36
+ "test": "pnpm -r test",
37
+ "lint": "pnpm -r lint",
38
+ "typecheck": "pnpm -r typecheck",
39
+ "clean": "pnpm -r clean",
40
+ "dev": "pnpm --filter @mod-bot/server dev"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.12.1",
44
+ "yaml": "^2.7.1",
45
+ "zod": "^3.24.4",
46
+ "ajv": "^8.17.1",
47
+ "simple-git": "^3.27.0"
48
+ },
49
+ "devDependencies": {
50
+ "tsup": "^8.5.1"
51
+ }
52
+ }