@beastmode-develeap/beastmode 0.1.245 → 0.1.246
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/web/board.html +37 -12
- package/dist/web/build-commit.txt +1 -1
- package/dist/web/build-stamp.txt +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/schemas.ts","../src/engine/provider-manager.ts","../src/engine/builtin-adapters.ts","../src/engine/import-adapter.ts","../src/engine/export-adapter.ts","../src/engine/stack-detector.ts","../src/engine/presets.ts","../src/engine/default-resolver.ts","../src/engine/secret-validator.ts","../src/engine/version.ts","../src/engine/scaffold-generator.ts","../src/engine/template-importer.ts","../src/engine/config-validator.ts","../src/engine/status-checker.ts","../src/engine/config-manager.ts","../src/engine/doctor.ts","../src/engine/upgrader.ts","../src/engine/plugin-resolver.ts","../src/engine/plugin-registry.ts","../src/engine/mcp-manager.ts","../src/engine/hook-manager.ts","../src/engine/plugin-installer.ts","../src/engine/skill-manager.ts","../src/engine/migrator.ts","../src/engine/bridge.ts","../src/engine/index.ts","../src/cli/utils/file-writer.ts","../src/cli/utils/display.ts","../src/cli/ui/api-routes.ts","../src/cli/ui/archival.ts","../src/cli/ui/inception.ts","../src/cli/ui/strategy.ts","../src/cli/ui/chat-handler.ts","../src/cli/ui/board-api-routes.ts","../src/cli/ui/server.ts","../src/cli/commands/board.ts","../src/cli/commands/sync-claude-creds.ts","../src/mcp/server.ts","../src/mcp/index.ts","../src/index.ts","../src/cli/commands/init.ts","../src/cli/utils/docker.ts","../src/cli/commands/export-config.ts","../src/cli/commands/validate.ts","../src/cli/commands/add.ts","../src/cli/commands/remove.ts","../src/cli/commands/list.ts","../src/cli/commands/import-cmd.ts","../src/cli/commands/status.ts","../src/cli/commands/config-cmd.ts","../src/cli/commands/doctor.ts","../src/cli/commands/upgrade.ts","../src/cli/utils/regenerate.ts","../src/cli/commands/migrate.ts","../src/cli/commands/run.ts","../src/cli/commands/daemon-cmd.ts","../src/cli/commands/mcp-cmd.ts","../src/cli/commands/deploy.ts","../src/cli/commands/up.ts","../src/cli/commands/down.ts","../src/cli/commands/logs-cmd.ts","../src/cli/commands/update.ts","../src/cli/commands/runner-cmd.ts","../src/cli/runner-image-builder.ts","../src/cli/stack-detect.ts","../src/cli/github-runners.ts","../src/cli/runner-helpers.ts","../src/cli/native-runner.ts","../src/cli/workflow-switcher.ts","../src/cli/commands/project-cmd.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const StageConfigSchema = z.object({\n enabled: z.union([z.boolean(), z.literal(\"auto\")]).default(true),\n provider: z.string().default(\"builtin\"),\n});\n\nexport const PipelineConfigSchema = z.object({\n preset: z.enum([\"full\", \"lean\", \"prototype\", \"infra\", \"docs\"]).default(\"full\"),\n stages: z.object({\n spec_refiner: StageConfigSchema.default({}),\n planner: StageConfigSchema.default({}),\n scenario_designer: StageConfigSchema.default({}),\n dtu_builder: StageConfigSchema.default({ enabled: \"auto\" }),\n build_verify_loop: StageConfigSchema.default({}),\n pr_review: StageConfigSchema.default({}),\n prod_verification: StageConfigSchema.default({ enabled: false }),\n }).default({}),\n satisfaction_threshold: z.number().min(0).max(1).default(0.85),\n prod_accept_floor: z.number().min(0).max(1).default(0.65),\n max_iterations: z.number().int().min(1).max(20).default(5),\n fail_fast_threshold: z.number().min(0).max(1).default(0.3),\n});\n\nexport const ModelsConfigSchema = z.object({\n spec: z.string().default(\"claude-opus-4-6\"),\n planner: z.string().default(\"claude-opus-4-6\"),\n coder: z.string().default(\"claude-opus-4-6\"),\n coder_iteration: z.string().default(\"claude-sonnet-4-6\"),\n verifier: z.string().default(\"claude-sonnet-4-6\"),\n reviewer: z.string().default(\"claude-sonnet-4-6\"),\n healing: z.string().default(\"claude-sonnet-4-6\"),\n precheck: z.string().default(\"claude-haiku-4-5\"),\n});\n\nexport const TaskBackendConfigSchema = z.object({\n adapter: z.string().default(\"beastmode-board\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const ResilienceConfigSchema = z.object({\n max_failures: z.number().int().min(1).default(5),\n healing_enabled: z.boolean().default(true),\n healing_max_attempts: z.number().int().min(1).default(3),\n stall_delta: z.number().min(0).max(1).default(0.05),\n stall_window: z.number().int().min(1).default(2),\n});\n\nexport const CostConfigSchema = z.object({\n model_tiering_enabled: z.boolean().default(true),\n incremental_verification: z.boolean().default(true),\n build_check_enabled: z.boolean().default(true),\n});\n\nexport const HumanGatesConfigSchema = z.object({\n spec_approval: z.boolean().default(true),\n epic_approval: z.boolean().default(true),\n pr_review: z.enum([\"automated\", \"human\", \"disabled\"]).default(\"automated\"),\n});\n\nexport const NotificationsConfigSchema = z.object({\n adapter: z.string().default(\"none\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const FactoryConfigSchema = z.object({\n pipeline: PipelineConfigSchema.default({}),\n models: ModelsConfigSchema.default({}),\n task_backend: TaskBackendConfigSchema.default({}),\n resilience: ResilienceConfigSchema.default({}),\n cost: CostConfigSchema.default({}),\n human_gates: HumanGatesConfigSchema.default({}),\n notifications: NotificationsConfigSchema.default({}),\n});\n\nexport const StackConfigSchema = z.object({\n detected: z.string(),\n build_command: z.string(),\n dev_command: z.string(),\n test_command: z.string(),\n install_command: z.string(),\n dev_port: z.number().int().default(3000),\n});\n\nexport const DeployConfigSchema = z.object({\n target: z.string().default(\"pr-only\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const ProjectConfigSchema = z.object({\n name: z.string(),\n repo: z.string().optional(),\n path: z.string(),\n stack: StackConfigSchema,\n deploy: DeployConfigSchema.default({}),\n pipeline: z.record(z.unknown()).default({}),\n models: z.record(z.string()).default({}),\n plugins: z.array(z.string()).default([]),\n});\n\nexport const FactoryIdentitySchema = z.object({\n factory_name: z.string(),\n engine_version: z.string(),\n schema_version: z.number().int().default(1),\n created_at: z.string(),\n});\n\n// ── Extension System Schemas ──\n\nexport const HOOK_EVENTS = [\n \"pre-spec\", \"post-spec\",\n \"pre-plan\", \"post-plan\",\n \"pre-build\", \"post-build\",\n \"pre-verify\", \"post-verify\",\n \"pre-ship\", \"post-ship\",\n \"on-convergence\", \"on-failure\", \"on-stuck\",\n] as const;\n\nexport type HookEvent = typeof HOOK_EVENTS[number];\n\nexport const HookEventSchema = z.enum(HOOK_EVENTS);\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n description: z.string().min(1),\n engine_version: z.string().min(1),\n stack_match: z.array(z.string()).default([]),\n provides: z.object({\n skills: z.array(z.string()).optional(),\n mcp_servers: z.array(z.string()).optional(),\n hooks: z.array(z.string()).optional(),\n }).default({}),\n dependencies: z.array(z.string()).default([]),\n config_defaults: z.string().optional(),\n});\n\nexport const McpServerEntrySchema = z.object({\n command: z.string().min(1),\n args: z.array(z.string()),\n config: z.record(z.unknown()).default({}),\n source: z.string().min(1),\n enabled: z.boolean().default(true),\n});\n\nexport const HookEntrySchema = z.object({\n name: z.string().min(1),\n command: z.string().optional(),\n skill: z.string().optional(),\n webhook: z.string().optional(),\n config: z.record(z.unknown()).default({}),\n source: z.string().min(1),\n});\n\nexport const RegistryEntrySchema = z.object({\n description: z.string(),\n repo: z.string(),\n versions: z.record(z.object({ ref: z.string() })),\n latest: z.string(),\n});\n\nexport const RegistryIndexSchema = z.object({\n version: z.number().int(),\n plugins: z.record(RegistryEntrySchema),\n});\n\nexport const LockEntrySchema = z.object({\n version: z.string(),\n source: z.string(),\n repo: z.string().optional(),\n ref: z.string().optional(),\n installed_at: z.string(),\n});\n\nexport const ExtensionsLockSchema = z.object({\n plugins: z.record(LockEntrySchema),\n locked_at: z.string(),\n});\n\n// ── Methodology Integration Schemas ──\n\nexport const PIPELINE_STAGES = [\n \"spec_refiner\",\n \"planner\",\n \"scenario_designer\",\n \"coder\",\n \"scenario_runner\",\n \"pr_review\",\n] as const;\n\nexport type PipelineStage = typeof PIPELINE_STAGES[number];\n\nexport const ARTIFACT_TYPES = [\n \"user_intent\",\n \"nlspec.md\",\n \"plan.md\",\n \"scenarios/\",\n \"code_changes\",\n \"satisfaction.json\",\n \"pr_diff\",\n \"review_verdict\",\n] as const;\n\nexport type ArtifactType = typeof ARTIFACT_TYPES[number];\n\nexport const PROVIDER_CONTRACTS: Record<\n typeof PIPELINE_STAGES[number],\n { input: string; output: string }\n> = {\n spec_refiner: { input: \"user_intent\", output: \"nlspec.md\" },\n planner: { input: \"nlspec.md\", output: \"plan.md\" },\n scenario_designer: { input: \"nlspec.md\", output: \"scenarios/\" },\n coder: { input: \"plan.md\", output: \"code_changes\" },\n scenario_runner: { input: \"scenarios/\", output: \"satisfaction.json\" },\n pr_review: { input: \"pr_diff\", output: \"review_verdict\" },\n} as const;\n\nexport const ProviderEntrySchema = z.object({\n name: z.string().min(1),\n skill: z.string().min(1),\n description: z.string().min(1),\n input: z.string().min(1),\n output: z.string().min(1),\n});\n\nexport const ImportAdapterEntrySchema = z.object({\n from_format: z.string().min(1),\n to_artifact: z.string().min(1),\n adapter: z.string().min(1),\n file_patterns: z.array(z.string()).default([\"*.md\"]),\n description: z.string().min(1),\n});\n\nexport const ExportAdapterEntrySchema = z.object({\n from_artifact: z.string().min(1),\n to_format: z.string().min(1),\n adapter: z.string().min(1),\n description: z.string().min(1),\n});\n\nexport const MethodologyPresetEntrySchema = z.object({\n description: z.string().min(1),\n config: z.string().min(1),\n});\n\nexport const MethodologyManifestSchema = z.object({\n name: z.string().min(1),\n methodology: z.string().min(1),\n version: z.string().min(1),\n providers: z.record(ProviderEntrySchema).default({}),\n import_adapters: z.record(ImportAdapterEntrySchema).default({}),\n export_adapters: z.record(ExportAdapterEntrySchema).default({}),\n presets: z.record(MethodologyPresetEntrySchema).default({}),\n});\n","import { PROVIDER_CONTRACTS, PIPELINE_STAGES, MethodologyManifestSchema } from \"./schemas.js\";\nimport type { FactoryConfig, MethodologyManifest } from \"./types.js\";\n\nexport interface BuiltinProviderInfo {\n type: \"builtin\";\n name: \"builtin\";\n stage: string;\n input: string;\n output: string;\n}\n\nexport interface PluginProviderInfo {\n type: \"plugin\";\n name: string;\n stage: string;\n pluginName: string;\n providerName: string;\n input: string;\n output: string;\n}\n\nexport type ProviderInfo = BuiltinProviderInfo | PluginProviderInfo;\n\nexport interface ProviderValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Resolve which provider handles a pipeline stage.\n * Pure function — no I/O.\n */\nexport function getStageProvider(\n config: FactoryConfig,\n stage: string\n): ProviderInfo {\n if (!(PIPELINE_STAGES as readonly string[]).includes(stage)) {\n throw new Error(`Unknown pipeline stage: '${stage}'`);\n }\n\n const contract = PROVIDER_CONTRACTS[stage as keyof typeof PROVIDER_CONTRACTS];\n\n // Read the provider field from stage config\n const stageConfig = (config.pipeline.stages as Record<string, { provider?: string }>)[stage];\n const providerName = stageConfig?.provider || \"builtin\";\n\n if (providerName === \"builtin\") {\n return {\n type: \"builtin\",\n name: \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n };\n }\n\n // Plugin provider: format is \"pluginName:providerName\"\n const colonIndex = providerName.indexOf(\":\");\n if (colonIndex === -1) {\n // Treat as builtin if no colon (defensive)\n return {\n type: \"builtin\",\n name: providerName as \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n };\n }\n\n const pluginName = providerName.slice(0, colonIndex);\n const provName = providerName.slice(colonIndex + 1);\n\n return {\n type: \"plugin\",\n name: providerName,\n stage,\n pluginName,\n providerName: provName,\n input: contract.input,\n output: contract.output,\n };\n}\n\n/**\n * Validate that a provider honors the stage contract.\n * For plugin providers, checks the methodology manifest.\n * Pure function — no I/O.\n */\nexport function validateProvider(\n provider: ProviderInfo,\n stage: string,\n manifest?: MethodologyManifest\n): ProviderValidationResult {\n const errors: string[] = [];\n\n if (provider.type === \"builtin\") {\n return { valid: true, errors: [] };\n }\n\n // Plugin provider — need manifest\n if (!manifest) {\n errors.push(\n `Plugin provider '${provider.name}' requires a methodology manifest, but none was provided.`\n );\n return { valid: false, errors };\n }\n\n // Check that the manifest declares a provider for this stage\n const stageProvider = manifest.providers[stage];\n if (!stageProvider) {\n errors.push(\n `Methodology '${manifest.name}' does not provide a provider for stage '${stage}'.`\n );\n return { valid: false, errors };\n }\n\n // Check input contract\n const contract = PROVIDER_CONTRACTS[stage as keyof typeof PROVIDER_CONTRACTS];\n if (stageProvider.input !== contract.input) {\n errors.push(\n `Provider '${provider.name}' declares input '${stageProvider.input}' but stage '${stage}' requires input '${contract.input}'.`\n );\n }\n\n // Check output contract\n if (stageProvider.output !== contract.output) {\n errors.push(\n `Provider '${provider.name}' declares output '${stageProvider.output}' but stage '${stage}' requires output '${contract.output}'.`\n );\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * List all available providers: builtins for all stages + any from methodology manifests.\n * Pure function — no I/O.\n */\nexport function listProviders(\n methodologyManifests: MethodologyManifest[]\n): ProviderInfo[] {\n const providers: ProviderInfo[] = [];\n\n // Add builtin providers for all stages\n for (const stage of PIPELINE_STAGES) {\n const contract = PROVIDER_CONTRACTS[stage];\n providers.push({\n type: \"builtin\",\n name: \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n });\n }\n\n // Add plugin providers from methodology manifests\n for (const manifest of methodologyManifests) {\n for (const [stage, entry] of Object.entries(manifest.providers)) {\n providers.push({\n type: \"plugin\",\n name: entry.name,\n stage,\n pluginName: manifest.name,\n providerName: entry.name.split(\":\")[1] || entry.name,\n input: entry.input,\n output: entry.output,\n });\n }\n }\n\n return providers;\n}\n\n/**\n * Parse and validate a raw object into a MethodologyManifest.\n * Pure function — no I/O.\n */\nexport function parseMethodologyManifest(raw: unknown): MethodologyManifest {\n if (typeof raw !== \"object\" || raw === null) {\n throw new Error(\"Methodology manifest must be a JSON object\");\n }\n const result = MethodologyManifestSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid methodology manifest:\\n${issues}`);\n }\n return result.data;\n}\n","/**\n * Built-in generic adapters for import/export.\n * All functions are pure — text in, text out. No I/O, no AI calls.\n * These are structural converters that parse common document formats\n * and produce BeastMode artifact formats.\n */\n\n// ── Section Parser Helpers ──\n\ninterface Section {\n heading: string;\n level: number;\n content: string;\n}\n\n/**\n * Parse markdown into sections by heading.\n */\nfunction parseSections(markdown: string): Section[] {\n const lines = markdown.split(\"\\n\");\n const sections: Section[] = [];\n let currentSection: Section | null = null;\n const contentLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n contentLines.length = 0;\n }\n currentSection = {\n heading: headingMatch[2].trim(),\n level: headingMatch[1].length,\n content: \"\",\n };\n } else {\n contentLines.push(line);\n }\n }\n\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n } else if (contentLines.join(\"\").trim()) {\n // Content with no heading\n sections.push({\n heading: \"\",\n level: 0,\n content: contentLines.join(\"\\n\").trim(),\n });\n }\n\n return sections;\n}\n\n/**\n * Find a section by heading pattern (case-insensitive).\n */\nfunction findSection(sections: Section[], pattern: RegExp): Section | undefined {\n return sections.find((s) => pattern.test(s.heading));\n}\n\n/**\n * Collect all sections matching a pattern.\n */\nfunction findSections(sections: Section[], pattern: RegExp): Section[] {\n return sections.filter((s) => pattern.test(s.heading));\n}\n\n// ── Import: PRD → NLSpec ──\n\n/**\n * Convert a PRD/requirements document to NLSpec format.\n * Extracts: goals, requirements, constraints, API endpoints, data models.\n * Reformats into standard NLSpec section structure.\n */\nexport function importPrd(prdContent: string): string {\n if (!prdContent.trim()) {\n return \"# NLSpec\\n\\n*Imported from PRD (empty source document)*\\n\";\n }\n\n const sections = parseSections(prdContent);\n const output: string[] = [];\n\n // Extract title from first h1 or use generic\n const titleSection = sections.find((s) => s.level === 1);\n const title = titleSection\n ? titleSection.heading.replace(/^(product\\s+)?requirements?\\s+(document|doc)?\\s*[-:.]?\\s*/i, \"\").trim() || \"Imported Spec\"\n : \"Imported Spec\";\n\n output.push(`# NLSpec: ${title}`);\n output.push(\"\");\n\n // Goals → Overview\n const goalsSection = findSection(sections, /goal|objective|overview|purpose|summary/i);\n if (goalsSection) {\n output.push(\"## Overview\");\n output.push(\"\");\n output.push(goalsSection.content);\n output.push(\"\");\n }\n\n // Requirements → Functional Requirements\n const reqSection = findSection(sections, /^requirements?$|functional\\s+requirements?/i);\n if (reqSection) {\n output.push(\"## Functional Requirements\");\n output.push(\"\");\n output.push(reqSection.content);\n output.push(\"\");\n }\n\n // Constraints → Constraints\n const constraintSection = findSection(sections, /constraint|limitation|non.?functional/i);\n if (constraintSection) {\n output.push(\"## Constraints\");\n output.push(\"\");\n output.push(constraintSection.content);\n output.push(\"\");\n }\n\n // API endpoints → API Contracts\n const apiSections = findSections(sections, /api|endpoint|route/i);\n if (apiSections.length > 0) {\n output.push(\"## API Contracts\");\n output.push(\"\");\n for (const section of apiSections) {\n if (section.level > 2) {\n output.push(`### ${section.heading}`);\n }\n if (section.content) {\n output.push(section.content);\n }\n output.push(\"\");\n }\n }\n\n // Data model → Data Structures\n const dataSection = findSection(sections, /data\\s*(model|structure)|schema|database|entit/i);\n if (dataSection) {\n output.push(\"## Data Structures\");\n output.push(\"\");\n output.push(dataSection.content);\n output.push(\"\");\n }\n\n // Remaining uncategorized sections\n const categorized = new Set<Section>();\n if (titleSection) categorized.add(titleSection);\n if (goalsSection) categorized.add(goalsSection);\n if (reqSection) categorized.add(reqSection);\n if (constraintSection) categorized.add(constraintSection);\n for (const s of apiSections) categorized.add(s);\n if (dataSection) categorized.add(dataSection);\n\n const remaining = sections.filter((s) => !categorized.has(s) && s.content.trim());\n if (remaining.length > 0) {\n output.push(\"## Additional Context\");\n output.push(\"\");\n for (const section of remaining) {\n if (section.heading) {\n output.push(`### ${section.heading}`);\n output.push(\"\");\n }\n output.push(section.content);\n output.push(\"\");\n }\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: User Stories → Plan ──\n\n/**\n * Convert a user story list to plan format.\n * Parses \"As a..., I want... so that...\" patterns.\n * Extracts acceptance criteria as task acceptance criteria.\n */\nexport function importUserStories(storiesContent: string): string {\n if (!storiesContent.trim()) {\n return \"# Plan\\n\\n*Imported from user stories (empty source document)*\\n\";\n }\n\n const output: string[] = [];\n output.push(\"# Plan: Imported from User Stories\");\n output.push(\"\");\n\n // Simpler approach: split by \"As a\" / \"As an\" patterns\n const lines = storiesContent.split(\"\\n\");\n const stories: string[] = [];\n let currentStory: string[] = [];\n let inStory = false;\n\n for (const line of lines) {\n const isStoryStart = /^\\s*(?:\\d+\\.\\s*)?(?:#{1,3}\\s*)?As an?\\s+/i.test(line);\n if (isStoryStart) {\n if (inStory && currentStory.length > 0) {\n stories.push(currentStory.join(\"\\n\").trim());\n }\n currentStory = [line];\n inStory = true;\n } else if (inStory) {\n // Non-heading, non-story-start line — part of current story\n if (line.trim() || currentStory.length === 1) {\n currentStory.push(line);\n } else if (!line.trim() && currentStory.length > 1) {\n // Blank line after content — still part of story (for acceptance criteria)\n currentStory.push(line);\n }\n }\n }\n if (inStory && currentStory.length > 0) {\n stories.push(currentStory.join(\"\\n\").trim());\n }\n\n if (stories.length === 0) {\n output.push(\"*No user stories found in source document.*\");\n output.push(\"\");\n return output.join(\"\\n\");\n }\n\n for (let i = 0; i < stories.length; i++) {\n const story = stories[i];\n const storyLines = story.split(\"\\n\");\n const storyLine = storyLines[0].replace(/^\\s*\\d+\\.\\s*/, \"\").replace(/^#{1,3}\\s*/, \"\").trim();\n\n output.push(`## Task ${i + 1}: ${storyLine}`);\n output.push(\"\");\n output.push(`**Story:** ${storyLine}`);\n output.push(\"\");\n\n // Look for acceptance criteria in remaining lines\n const remaining = storyLines.slice(1).join(\"\\n\").trim();\n if (remaining) {\n output.push(`**Acceptance Criteria:**`);\n output.push(remaining);\n output.push(\"\");\n }\n\n output.push(`**Dependencies:** TBD`);\n output.push(\"\");\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: RFC/ADR → NLSpec ──\n\n/**\n * Convert an RFC or ADR document to NLSpec format.\n * Extracts: context, decision, consequences, requirements.\n */\nexport function importRfc(rfcContent: string): string {\n if (!rfcContent.trim()) {\n return \"# NLSpec\\n\\n*Imported from RFC (empty source document)*\\n\";\n }\n\n const sections = parseSections(rfcContent);\n const output: string[] = [];\n\n // Extract title\n const titleSection = sections.find((s) => s.level === 1);\n const title = titleSection\n ? titleSection.heading.replace(/^(RFC|ADR)[-:\\s]*\\d*[-:\\s]*/i, \"\").trim() || \"Imported from RFC\"\n : \"Imported from RFC\";\n\n output.push(`# NLSpec: ${title}`);\n output.push(\"\");\n\n // Context / Problem → Context\n const contextSection = findSection(sections, /context|problem|background|motivation/i);\n if (contextSection) {\n output.push(\"## Context\");\n output.push(\"\");\n output.push(contextSection.content);\n output.push(\"\");\n }\n\n // Decision → Overview\n const decisionSection = findSection(sections, /decision|solution|approach|proposal/i);\n if (decisionSection) {\n output.push(\"## Overview\");\n output.push(\"\");\n output.push(decisionSection.content);\n output.push(\"\");\n }\n\n // Requirements → Functional Requirements\n const reqSection = findSection(sections, /requirement|specification|feature/i);\n if (reqSection) {\n output.push(\"## Functional Requirements\");\n output.push(\"\");\n output.push(reqSection.content);\n output.push(\"\");\n }\n\n // Consequences / Impact → Constraints\n const consequencesSection = findSection(sections, /consequence|impact|trade.?off|risk/i);\n if (consequencesSection) {\n output.push(\"## Constraints\");\n output.push(\"\");\n output.push(consequencesSection.content);\n output.push(\"\");\n }\n\n // Status\n const statusSection = findSection(sections, /status/i);\n if (statusSection) {\n output.push(\"## Status\");\n output.push(\"\");\n output.push(statusSection.content);\n output.push(\"\");\n }\n\n // Remaining sections\n const categorized = new Set<Section>();\n if (titleSection) categorized.add(titleSection);\n if (contextSection) categorized.add(contextSection);\n if (decisionSection) categorized.add(decisionSection);\n if (reqSection) categorized.add(reqSection);\n if (consequencesSection) categorized.add(consequencesSection);\n if (statusSection) categorized.add(statusSection);\n\n const remaining = sections.filter((s) => !categorized.has(s) && s.content.trim());\n if (remaining.length > 0) {\n output.push(\"## Additional Context\");\n output.push(\"\");\n for (const section of remaining) {\n if (section.heading) {\n output.push(`### ${section.heading}`);\n output.push(\"\");\n }\n output.push(section.content);\n output.push(\"\");\n }\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: Test Cases → Scenarios ──\n\ninterface ScenarioFile {\n name: string;\n content: string;\n}\n\n/**\n * Convert manual test cases to BeastMode scenario format.\n * Returns a JSON string of ScenarioFile[] (array of {name, content}).\n * Each test case becomes one scenario file.\n */\nexport function importTestCases(testCasesContent: string): string {\n if (!testCasesContent.trim()) {\n return \"[]\";\n }\n\n const sections = parseSections(testCasesContent);\n const scenarios: ScenarioFile[] = [];\n\n // Find test case sections (## TC-XXX: or ## Test Case N: or similar)\n const tcSections = sections.filter(\n (s) => s.level >= 2 && /^(TC[-\\s]?\\d+|Test\\s*Case\\s*\\d+)/i.test(s.heading)\n );\n\n // If no TC-pattern sections found, try any h2 sections that look like test cases\n const candidateSections = tcSections.length > 0\n ? tcSections\n : sections.filter((s) => s.level === 2 && s.content.trim());\n\n for (const section of candidateSections) {\n const name = section.heading\n .replace(/[^a-zA-Z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\");\n\n const scenarioContent: string[] = [];\n const heading = section.heading;\n scenarioContent.push(`# Scenario: ${heading}`);\n scenarioContent.push(\"\");\n\n // Parse preconditions, steps, expected from content\n const content = section.content;\n const preMatch = content.match(/(?:precondition|pre-condition|setup)s?\\s*:\\s*([\\s\\S]*?)(?=steps?\\s*:|expected\\s*:|$)/i);\n const stepsMatch = content.match(/steps?\\s*:\\s*([\\s\\S]*?)(?=expected\\s*:|$)/i);\n const expectedMatch = content.match(/expected\\s*(?:result|outcome)?s?\\s*:\\s*([\\s\\S]*?)$/i);\n\n scenarioContent.push(\"## Setup\");\n scenarioContent.push(preMatch ? preMatch[1].trim() : \"No specific preconditions.\");\n scenarioContent.push(\"\");\n\n scenarioContent.push(\"## Actions\");\n scenarioContent.push(stepsMatch ? stepsMatch[1].trim() : content.trim());\n scenarioContent.push(\"\");\n\n scenarioContent.push(\"## Expected\");\n scenarioContent.push(expectedMatch ? expectedMatch[1].trim() : \"Verify behavior is correct.\");\n scenarioContent.push(\"\");\n\n scenarios.push({\n name: name || `scenario-${scenarios.length + 1}`,\n content: scenarioContent.join(\"\\n\"),\n });\n }\n\n return JSON.stringify(scenarios, null, 2);\n}\n\n// ── Export: Any Artifact → Clean Markdown ──\n\n/**\n * Clean up a BeastMode artifact for external consumption.\n * Strips internal markers, HTML comments, and normalizes formatting.\n */\nexport function exportMarkdown(content: string): string {\n if (!content.trim()) {\n return \"\";\n }\n\n let result = content;\n\n // Strip HTML comments (single-line and multi-line)\n result = result.replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n // Trim trailing whitespace on each line\n result = result\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .join(\"\\n\");\n\n // Collapse 3+ consecutive blank lines into 2\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n\n // Trim leading/trailing whitespace\n result = result.trim();\n\n // Add metadata footer\n const date = new Date().toISOString().split(\"T\")[0];\n result = result + `\\n\\n---\\n*Exported from BeastMode on ${date}*\\n`;\n\n return result;\n}\n","import type { MethodologyManifest } from \"./types.js\";\nimport {\n importPrd,\n importUserStories,\n importRfc,\n importTestCases,\n} from \"./builtin-adapters.js\";\n\nexport interface BuiltinImportAdapterRef {\n type: \"builtin\";\n id: string;\n name: string;\n to_artifact: string;\n}\n\nexport interface PluginImportAdapterRef {\n type: \"plugin\";\n id: string;\n pluginName: string;\n adapterName: string;\n adapterPath: string;\n to_artifact: string;\n}\n\nexport type ImportAdapterRef = BuiltinImportAdapterRef | PluginImportAdapterRef;\n\nconst BUILTIN_IMPORT_ADAPTERS: Record<string, { to_artifact: string }> = {\n prd: { to_artifact: \"nlspec.md\" },\n \"user-stories\": { to_artifact: \"plan.md\" },\n rfc: { to_artifact: \"nlspec.md\" },\n \"test-cases\": { to_artifact: \"scenarios/\" },\n};\n\n/**\n * Resolve an adapter ID to its reference (builtin or plugin).\n * Pure function — no I/O.\n */\nexport function resolveImportAdapter(\n adapterId: string,\n methodologyManifests?: MethodologyManifest[]\n): ImportAdapterRef {\n const colonIndex = adapterId.indexOf(\":\");\n if (colonIndex === -1) {\n throw new Error(\n `Invalid adapter ID '${adapterId}'. Must be in format 'namespace:name' (e.g., 'generic:prd').`\n );\n }\n\n const namespace = adapterId.slice(0, colonIndex);\n const name = adapterId.slice(colonIndex + 1);\n\n if (namespace === \"generic\") {\n const entry = BUILTIN_IMPORT_ADAPTERS[name];\n if (!entry) {\n throw new Error(\n `Unknown built-in import adapter 'generic:${name}'. Available: ${Object.keys(BUILTIN_IMPORT_ADAPTERS).map((k) => `generic:${k}`).join(\", \")}`\n );\n }\n return {\n type: \"builtin\",\n id: adapterId,\n name,\n to_artifact: entry.to_artifact,\n };\n }\n\n // Plugin adapter\n const manifests = methodologyManifests || [];\n const manifest = manifests.find((m) => m.name === namespace);\n if (!manifest) {\n throw new Error(\n `No methodology manifest found for plugin '${namespace}'. Is the plugin installed?`\n );\n }\n\n const adapterEntry = manifest.import_adapters[name];\n if (!adapterEntry) {\n throw new Error(\n `Import adapter '${name}' not found in methodology '${namespace}'. Available: ${Object.keys(manifest.import_adapters).join(\", \") || \"none\"}`\n );\n }\n\n return {\n type: \"plugin\",\n id: adapterId,\n pluginName: namespace,\n adapterName: name,\n adapterPath: adapterEntry.adapter,\n to_artifact: adapterEntry.to_artifact,\n };\n}\n\n/**\n * Run an import adapter on source content.\n * For builtin adapters, calls the corresponding pure function.\n * For plugin adapters, returns the raw content (plugin adapter execution is a future feature).\n * Pure function — no I/O.\n */\nexport function runImportAdapter(\n adapterId: string,\n sourceContent: string,\n methodologyManifests?: MethodologyManifest[]\n): string {\n const ref = resolveImportAdapter(adapterId, methodologyManifests);\n\n if (ref.type === \"builtin\") {\n switch (ref.name) {\n case \"prd\":\n return importPrd(sourceContent);\n case \"user-stories\":\n return importUserStories(sourceContent);\n case \"rfc\":\n return importRfc(sourceContent);\n case \"test-cases\":\n return importTestCases(sourceContent);\n default:\n throw new Error(`No built-in import handler for '${ref.name}'`);\n }\n }\n\n // Plugin adapter — return source content as-is for now\n // AI-powered transformation will be implemented with methodology plugins\n return sourceContent;\n}\n","import type { MethodologyManifest } from \"./types.js\";\nimport { exportMarkdown } from \"./builtin-adapters.js\";\n\nexport interface BuiltinExportAdapterRef {\n type: \"builtin\";\n id: string;\n name: string;\n from_artifact: string; // \"*\" for generic:markdown (works on any artifact)\n}\n\nexport interface PluginExportAdapterRef {\n type: \"plugin\";\n id: string;\n pluginName: string;\n adapterName: string;\n adapterPath: string;\n from_artifact: string;\n}\n\nexport type ExportAdapterRef = BuiltinExportAdapterRef | PluginExportAdapterRef;\n\nconst BUILTIN_EXPORT_ADAPTERS: Record<string, { from_artifact: string }> = {\n markdown: { from_artifact: \"*\" },\n};\n\n/**\n * Resolve an export adapter ID to its reference.\n * Pure function — no I/O.\n */\nexport function resolveExportAdapter(\n adapterId: string,\n methodologyManifests?: MethodologyManifest[]\n): ExportAdapterRef {\n const colonIndex = adapterId.indexOf(\":\");\n if (colonIndex === -1) {\n throw new Error(\n `Invalid adapter ID '${adapterId}'. Must be in format 'namespace:name' (e.g., 'generic:markdown').`\n );\n }\n\n const namespace = adapterId.slice(0, colonIndex);\n const name = adapterId.slice(colonIndex + 1);\n\n if (namespace === \"generic\") {\n const entry = BUILTIN_EXPORT_ADAPTERS[name];\n if (!entry) {\n throw new Error(\n `Unknown built-in export adapter 'generic:${name}'. Available: ${Object.keys(BUILTIN_EXPORT_ADAPTERS).map((k) => `generic:${k}`).join(\", \")}`\n );\n }\n return {\n type: \"builtin\",\n id: adapterId,\n name,\n from_artifact: entry.from_artifact,\n };\n }\n\n // Plugin adapter\n const manifests = methodologyManifests || [];\n const manifest = manifests.find((m) => m.name === namespace);\n if (!manifest) {\n throw new Error(\n `No methodology manifest found for plugin '${namespace}'. Is the plugin installed?`\n );\n }\n\n const adapterEntry = manifest.export_adapters[name];\n if (!adapterEntry) {\n throw new Error(\n `Export adapter '${name}' not found in methodology '${namespace}'. Available: ${Object.keys(manifest.export_adapters).join(\", \") || \"none\"}`\n );\n }\n\n return {\n type: \"plugin\",\n id: adapterId,\n pluginName: namespace,\n adapterName: name,\n adapterPath: adapterEntry.adapter,\n from_artifact: adapterEntry.from_artifact,\n };\n}\n\n/**\n * Run an export adapter on source content.\n * For builtin adapters, calls the corresponding pure function.\n * For plugin adapters, returns the raw content (future: AI-powered).\n * Pure function — no I/O.\n */\nexport function runExportAdapter(\n adapterId: string,\n sourceContent: string,\n methodologyManifests?: MethodologyManifest[]\n): string {\n const ref = resolveExportAdapter(adapterId, methodologyManifests);\n\n if (ref.type === \"builtin\") {\n switch (ref.name) {\n case \"markdown\":\n return exportMarkdown(sourceContent);\n default:\n throw new Error(`No built-in export handler for '${ref.name}'`);\n }\n }\n\n // Plugin adapter — return source content as-is for now\n return sourceContent;\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { StackInfo } from \"./types.js\";\n\ninterface StackPreset {\n language: string;\n build: string;\n dev: string;\n test: string;\n install: string;\n port: number;\n preset: string;\n deploy: string;\n plugins: string[];\n}\n\nconst STACK_PRESETS: Record<string, StackPreset> = {\n nextjs: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"npx playwright test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"nextjs\", \"playwright\"],\n },\n vite: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 5173,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"playwright\"],\n },\n react: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} start\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"playwright\"],\n },\n node: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n fastapi: {\n language: \"python\",\n build: \"python -m build\",\n dev: \"uvicorn main:app --reload\",\n test: \"pytest\",\n install: \"pip install -e .\",\n port: 8000,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [\"playwright\"],\n },\n django: {\n language: \"python\",\n build: \"python manage.py collectstatic --noinput\",\n dev: \"python manage.py runserver\",\n test: \"python manage.py test\",\n install: \"pip install -r requirements.txt\",\n port: 8000,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [\"playwright\"],\n },\n python: {\n language: \"python\",\n build: \"python -m build\",\n dev: \"python -m uvicorn main:app --reload\",\n test: \"pytest\",\n install: \"pip install -e .\",\n port: 8000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n go: {\n language: \"go\",\n build: \"go build ./...\",\n dev: \"go run .\",\n test: \"go test ./...\",\n install: \"go mod download\",\n port: 8080,\n preset: \"lean\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n rust: {\n language: \"rust\",\n build: \"cargo build --release\",\n dev: \"cargo run\",\n test: \"cargo test\",\n install: \"cargo build\",\n port: 8080,\n preset: \"lean\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n \"java-maven\": {\n language: \"java\",\n build: \"mvn package\",\n dev: \"mvn spring-boot:run\",\n test: \"mvn test\",\n install: \"mvn install\",\n port: 8080,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n \"java-gradle\": {\n language: \"java\",\n build: \"./gradlew build\",\n dev: \"./gradlew bootRun\",\n test: \"./gradlew test\",\n install: \"./gradlew build\",\n port: 8080,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n unknown: {\n language: \"unknown\",\n build: \"echo 'no build command configured'\",\n dev: \"echo 'no dev command configured'\",\n test: \"echo 'no test command configured'\",\n install: \"echo 'no install command configured'\",\n port: 3000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n};\n\nfunction readFileSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction parseJsonSafe(content: string): Record<string, unknown> | null {\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(projectDir: string): string {\n if (existsSync(join(projectDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(projectDir, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(projectDir, \"bun.lockb\"))) return \"bun\";\n return \"npm\";\n}\n\nfunction resolveCommands(preset: StackPreset, pm: string): StackPreset {\n return {\n ...preset,\n build: preset.build.replace(\"{pm}\", pm),\n dev: preset.dev.replace(\"{pm}\", pm),\n test: preset.test.replace(\"{pm}\", pm),\n install: preset.install.replace(\"{pm}\", pm),\n };\n}\n\nfunction detectFramework(projectDir: string): string {\n const pkgContent = readFileSafe(join(projectDir, \"package.json\"));\n if (pkgContent) {\n const pkg = parseJsonSafe(pkgContent);\n if (pkg) {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n if (deps.next) return \"nextjs\";\n if (deps.vite) return \"vite\";\n if (deps[\"react-scripts\"]) return \"react\";\n return \"node\";\n }\n return \"node\";\n }\n\n if (existsSync(join(projectDir, \"manage.py\"))) return \"django\";\n const pyproject = readFileSafe(join(projectDir, \"pyproject.toml\"));\n if (pyproject) {\n if (pyproject.toLowerCase().includes(\"fastapi\")) return \"fastapi\";\n return \"python\";\n }\n if (existsSync(join(projectDir, \"requirements.txt\"))) {\n const reqs = readFileSafe(join(projectDir, \"requirements.txt\")) || \"\";\n if (reqs.toLowerCase().includes(\"django\")) return \"django\";\n if (reqs.toLowerCase().includes(\"fastapi\")) return \"fastapi\";\n return \"python\";\n }\n\n if (existsSync(join(projectDir, \"go.mod\"))) return \"go\";\n if (existsSync(join(projectDir, \"Cargo.toml\"))) return \"rust\";\n if (existsSync(join(projectDir, \"pom.xml\"))) return \"java-maven\";\n if (\n existsSync(join(projectDir, \"build.gradle\")) ||\n existsSync(join(projectDir, \"build.gradle.kts\"))\n )\n return \"java-gradle\";\n\n return \"unknown\";\n}\n\nfunction extractGitRemote(projectDir: string): string | null {\n const gitConfig = readFileSafe(join(projectDir, \".git\", \"config\"));\n if (!gitConfig) return null;\n\n const sshMatch = gitConfig.match(/url\\s*=\\s*git@github\\.com:([^/]+\\/[^.\\s]+)/);\n if (sshMatch) return sshMatch[1];\n\n const httpsMatch = gitConfig.match(/url\\s*=\\s*https:\\/\\/github\\.com\\/([^/]+\\/[^.\\s]+)/);\n if (httpsMatch) return httpsMatch[1].replace(/\\.git$/, \"\");\n\n return null;\n}\n\nexport function detectStack(projectDir: string): StackInfo {\n const framework = detectFramework(projectDir);\n const preset = STACK_PRESETS[framework] || STACK_PRESETS.unknown;\n const pm = [\"nextjs\", \"vite\", \"react\", \"node\"].includes(framework)\n ? detectPackageManager(projectDir)\n : preset.language === \"python\"\n ? \"pip\"\n : \"\";\n const resolved = resolveCommands(preset, pm);\n\n return {\n language: resolved.language,\n framework,\n package_manager: pm,\n has_docker:\n existsSync(join(projectDir, \"Dockerfile\")) ||\n existsSync(join(projectDir, \"docker-compose.yml\")) ||\n existsSync(join(projectDir, \"docker-compose.yaml\")),\n has_ci:\n existsSync(join(projectDir, \".github\", \"workflows\")) ||\n existsSync(join(projectDir, \".gitlab-ci.yml\")) ||\n existsSync(join(projectDir, \".circleci\")),\n git_remote: extractGitRemote(projectDir),\n suggested_commands: {\n build: resolved.build,\n dev: resolved.dev,\n test: resolved.test,\n install: resolved.install,\n },\n dev_port: resolved.port,\n suggested_plugins: resolved.plugins,\n suggested_preset: resolved.preset,\n suggested_deploy: resolved.deploy,\n };\n}\n","interface StageOverrides {\n spec_refiner: { enabled: boolean | \"auto\" };\n planner: { enabled: boolean | \"auto\" };\n scenario_designer: { enabled: boolean | \"auto\" };\n dtu_builder: { enabled: boolean | \"auto\" };\n build_verify_loop: { enabled: boolean | \"auto\" };\n pr_review: { enabled: boolean | \"auto\" };\n prod_verification: { enabled: boolean | \"auto\" };\n}\n\nexport interface PresetConfig {\n stages: StageOverrides;\n satisfaction_threshold: number;\n max_iterations: number;\n description: string;\n}\n\nconst ALL_ENABLED: StageOverrides = {\n spec_refiner: { enabled: true },\n planner: { enabled: true },\n scenario_designer: { enabled: true },\n dtu_builder: { enabled: \"auto\" },\n build_verify_loop: { enabled: true },\n pr_review: { enabled: true },\n prod_verification: { enabled: false },\n};\n\nexport const PRESETS: Record<string, PresetConfig> = {\n full: {\n stages: ALL_ENABLED,\n satisfaction_threshold: 0.85,\n max_iterations: 5,\n description: \"All stages enabled, high quality bar — for production apps with CI/CD\",\n },\n lean: {\n stages: {\n ...ALL_ENABLED,\n dtu_builder: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.75,\n max_iterations: 3,\n description: \"Skip DTU + prod verify, lower threshold — for scripts, tools, CLIs\",\n },\n prototype: {\n stages: {\n ...ALL_ENABLED,\n scenario_designer: { enabled: false },\n build_verify_loop: { enabled: false },\n dtu_builder: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 1,\n description: \"Spec → build → PR, no scenarios — for rapid prototyping, hackathons\",\n },\n infra: {\n stages: {\n ...ALL_ENABLED,\n dtu_builder: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 5,\n description: \"Terraform-focused, AWS-CLI verification — for infrastructure tasks\",\n },\n docs: {\n stages: {\n ...ALL_ENABLED,\n scenario_designer: { enabled: false },\n dtu_builder: { enabled: false },\n build_verify_loop: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 1,\n description: \"Spec → build → PR only — for documentation, content changes\",\n },\n};\n\nexport function getPreset(name: string): PresetConfig {\n const preset = PRESETS[name];\n if (!preset) {\n throw new Error(`Unknown preset: ${name}. Available: ${listPresets().join(\", \")}`);\n }\n return preset;\n}\n\nexport function listPresets(): string[] {\n return Object.keys(PRESETS);\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\nimport { getPreset } from \"./presets.js\";\nimport type { FactoryConfig, StackInfo } from \"./types.js\";\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = target[key];\n if (\n sourceVal !== null &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n targetVal !== null &&\n typeof targetVal === \"object\" &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>\n );\n } else {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\nexport function resolveDefaults(\n partial: Record<string, unknown>,\n _stack: StackInfo\n): FactoryConfig {\n // 1. Start with schema defaults\n const base = FactoryConfigSchema.parse({});\n\n // 2. Determine which preset to use\n const presetName =\n (partial.pipeline as Record<string, unknown> | undefined)?.preset as string | undefined;\n const preset = getPreset(presetName || _stack.suggested_preset);\n\n // 3. Apply preset overrides to base\n const withPreset = deepMerge(\n base as unknown as Record<string, unknown>,\n {\n pipeline: {\n preset: presetName || _stack.suggested_preset,\n stages: preset.stages,\n satisfaction_threshold: preset.satisfaction_threshold,\n max_iterations: preset.max_iterations,\n },\n }\n );\n\n // 4. Apply user overrides on top (highest priority)\n const merged = deepMerge(withPreset, partial);\n\n // 5. Validate and return\n return FactoryConfigSchema.parse(merged);\n}\n\nexport function resolveProject(\n factoryConfig: FactoryConfig,\n projectOverrides: Record<string, unknown>\n): FactoryConfig {\n const merged = deepMerge(\n factoryConfig as unknown as Record<string, unknown>,\n projectOverrides\n );\n return FactoryConfigSchema.parse(merged);\n}\n","import type { FactoryConfig, SecretReport, SecretRequirement } from \"./types.js\";\n\ninterface SecretContext {\n deploy_target?: string;\n}\n\nconst DEPLOY_SECRETS: Record<string, SecretRequirement[]> = {\n vercel: [{ name: \"VERCEL_TOKEN\", reason: \"Vercel deployment\", required: true }],\n netlify: [{ name: \"NETLIFY_AUTH_TOKEN\", reason: \"Netlify deployment\", required: true }],\n \"aws-ecs\": [\n { name: \"AWS_ACCESS_KEY_ID\", reason: \"AWS ECS deployment\", required: true },\n { name: \"AWS_SECRET_ACCESS_KEY\", reason: \"AWS ECS deployment\", required: true },\n ],\n \"aws-lambda\": [\n { name: \"AWS_ACCESS_KEY_ID\", reason: \"AWS Lambda deployment\", required: true },\n { name: \"AWS_SECRET_ACCESS_KEY\", reason: \"AWS Lambda deployment\", required: true },\n ],\n \"gcp-cloud-run\": [\n { name: \"GOOGLE_APPLICATION_CREDENTIALS\", reason: \"GCP Cloud Run deployment\", required: true },\n ],\n};\n\nconst BACKEND_SECRETS: Record<string, SecretRequirement[]> = {\n linear: [{ name: \"LINEAR_API_KEY\", reason: \"Linear task backend\", required: true }],\n jira: [{ name: \"JIRA_API_TOKEN\", reason: \"Jira task backend\", required: true }],\n};\n\nexport function validateSecrets(\n config: FactoryConfig,\n env: Record<string, string | undefined>,\n context: SecretContext = {}\n): SecretReport {\n const required: SecretRequirement[] = [\n // ANTHROPIC_API_KEY is optional — the pipeline uses the Claude Code CLI\n // (`claude login`) by default. If set, it enables faster direct API calls.\n { name: \"ANTHROPIC_API_KEY\", reason: \"Optional: faster direct API calls (pipeline uses Claude Code CLI by default)\", required: false },\n { name: \"GITHUB_TOKEN\", reason: \"PR creation and repo access\", required: true },\n ];\n\n // Add backend-specific secrets\n const backendSecrets = BACKEND_SECRETS[config.task_backend.adapter];\n if (backendSecrets) {\n required.push(...backendSecrets);\n }\n\n // Add deploy-specific secrets\n const deployTarget = context.deploy_target || \"pr-only\";\n const deploySecrets = DEPLOY_SECRETS[deployTarget];\n if (deploySecrets) {\n required.push(...deploySecrets);\n }\n\n const present: string[] = [];\n const missing: string[] = [];\n const optional: string[] = [];\n\n for (const req of required) {\n if (env[req.name]) {\n present.push(req.name);\n } else if (req.required) {\n missing.push(req.name);\n } else {\n optional.push(req.name);\n }\n }\n\n return { required, present, missing, optional };\n}\n","export const ENGINE_VERSION = \"0.1.0\";\nexport const SCHEMA_VERSION = 1;\n","import type { FactoryConfig, FileAction, StackInfo } from \"./types.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\ninterface ProjectInput {\n name: string;\n repo?: string;\n path: string;\n stack: StackInfo;\n deploy_target?: string;\n}\n\nexport function scaffoldFactory(\n factoryName: string,\n config: FactoryConfig,\n project: ProjectInput\n): FileAction[] {\n const base = factoryName;\n const bm = `${base}/.beastmode`;\n const actions: FileAction[] = [];\n\n // factory.json\n actions.push({\n path: `${bm}/factory.json`,\n content: JSON.stringify(\n {\n factory_name: factoryName,\n engine_version: ENGINE_VERSION,\n schema_version: SCHEMA_VERSION,\n created_at: new Date().toISOString(),\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // config.json\n actions.push({\n path: `${bm}/config.json`,\n content: JSON.stringify(config, null, 2),\n action: \"create\",\n });\n\n // projects/<name>.json\n actions.push({\n path: `${bm}/projects/${project.name}.json`,\n content: JSON.stringify(\n {\n name: project.name,\n repo: project.repo || project.stack.git_remote || \"\",\n path: project.path,\n stack: {\n detected: project.stack.framework,\n build_command: project.stack.suggested_commands.build,\n dev_command: project.stack.suggested_commands.dev,\n test_command: project.stack.suggested_commands.test,\n install_command: project.stack.suggested_commands.install,\n dev_port: project.stack.dev_port,\n },\n deploy: {\n target: project.deploy_target || project.stack.suggested_deploy,\n config: {},\n },\n pipeline: {},\n models: {},\n plugins: project.stack.suggested_plugins,\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // hooks.json\n actions.push({\n path: `${bm}/hooks.json`,\n content: JSON.stringify(\n {\n hooks: {\n \"pre-spec\": [],\n \"post-spec\": [],\n \"pre-plan\": [],\n \"post-plan\": [],\n \"pre-build\": [],\n \"post-build\": [],\n \"pre-verify\": [],\n \"post-verify\": [],\n \"pre-ship\": [],\n \"post-ship\": [],\n \"on-convergence\": [],\n \"on-failure\": [],\n \"on-stuck\": [],\n },\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // mcp-servers.json\n actions.push({\n path: `${bm}/mcp-servers.json`,\n content: JSON.stringify({ servers: {} }, null, 2),\n action: \"create\",\n });\n\n // extensions.lock\n actions.push({\n path: `${bm}/extensions.lock`,\n content: JSON.stringify({ plugins: {}, locked_at: new Date().toISOString() }, null, 2),\n action: \"create\",\n });\n\n // secrets.env.local (empty, gitignored)\n actions.push({\n path: `${bm}/secrets.env.local`,\n content: \"# BeastMode secrets — DO NOT COMMIT\\n# Add your secrets here or set as environment variables\\n\",\n action: \"create\",\n });\n\n // .gitignore\n actions.push({\n path: `${base}/.gitignore`,\n content: [\n \"# BeastMode\",\n \".beastmode/secrets.env.local\",\n \"runs/\",\n \"logs/\",\n \"node_modules/\",\n \"dist/\",\n \".env\",\n \".env.local\",\n \"*.log\",\n \".DS_Store\",\n \"\",\n ].join(\"\\n\"),\n action: \"create\",\n });\n\n // .env.example\n actions.push({\n path: `${base}/.env.example`,\n content: [\n \"# BeastMode — Environment Variables\",\n \"# Copy to .env.local or set in your shell\",\n \"\",\n \"# AI auth: uses Claude Code CLI by default (`claude login`).\",\n \"# Set ANTHROPIC_API_KEY for faster direct API calls (optional).\",\n \"# ANTHROPIC_API_KEY=\",\n \"\",\n \"# Required: GitHub access (needs repo + workflow scopes)\",\n \"GITHUB_TOKEN=\",\n \"\",\n \"# Optional: Task backend (only if not using built-in board)\",\n \"# LINEAR_API_KEY=\",\n \"\",\n \"# Optional: Deploy target secrets\",\n \"# VERCEL_TOKEN=\",\n \"# AWS_ACCESS_KEY_ID=\",\n \"# AWS_SECRET_ACCESS_KEY=\",\n \"\",\n ].join(\"\\n\"),\n action: \"create\",\n });\n\n // Create empty directories by placing .gitkeep\n for (const dir of [\"runs\", \"logs\"]) {\n actions.push({\n path: `${base}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n // Create empty directories for plugins and skills\n for (const dir of [\"plugins\", \"skills\"]) {\n actions.push({\n path: `${bm}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n return actions;\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\nimport type { FactoryConfig } from \"./types.js\";\n\nexport interface FactoryTemplate {\n factory_name?: string;\n config: FactoryConfig;\n plugins: string[];\n methodology?: string;\n}\n\nexport function parseTemplate(raw: string): FactoryTemplate {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Template is not valid JSON\");\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Template must be a JSON object\");\n }\n\n const obj = parsed as Record<string, unknown>;\n\n const configResult = FactoryConfigSchema.safeParse(obj.config || {});\n if (!configResult.success) {\n const issues = configResult.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid template config:\\n${issues}`);\n }\n\n return {\n factory_name: typeof obj.factory_name === \"string\" ? obj.factory_name : undefined,\n config: configResult.data,\n plugins: Array.isArray(obj.plugins) ? obj.plugins.filter((p): p is string => typeof p === \"string\") : [],\n methodology: typeof obj.methodology === \"string\" ? obj.methodology : undefined,\n };\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { FactoryConfigSchema, FactoryIdentitySchema } from \"./schemas.js\";\nimport { validateSecrets } from \"./secret-validator.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\nexport function validateFactory(\n factoryDir: string,\n env: Record<string, string | undefined>\n): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const bmDir = join(factoryDir, \".beastmode\");\n\n // Check .beastmode exists\n if (!existsSync(bmDir)) {\n return { valid: false, errors: [`No factory found at ${factoryDir} (.beastmode directory missing)`], warnings };\n }\n\n // Check factory.json\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n errors.push(\"Missing .beastmode/factory.json\");\n } else {\n try {\n const raw = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const result = FactoryIdentitySchema.safeParse(raw);\n if (!result.success) {\n errors.push(`Invalid factory.json: ${result.error.issues.map((i) => i.message).join(\", \")}`);\n }\n } catch {\n errors.push(\"factory.json is not valid JSON\");\n }\n }\n\n // Check config.json\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n errors.push(\"Missing .beastmode/config.json\");\n } else {\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const result = FactoryConfigSchema.safeParse(raw);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push(`config.json ${issue.path.join(\".\")}: ${issue.message}`);\n }\n } else {\n // Validate secrets\n const secretReport = validateSecrets(result.data, env as Record<string, string>);\n for (const key of secretReport.missing) {\n warnings.push(`Secret not set: ${key}`);\n }\n }\n } catch {\n errors.push(\"config.json is not valid JSON\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import type { FactoryIdentity } from \"./types.js\";\n\n// Grace window (seconds) for considering a daemon heartbeat \"fresh\".\n// Matches GRACE_WINDOW_SECONDS on the board side (180s = ~3 missed polls\n// at the default 30-60s poll interval).\nexport const DAEMON_HEARTBEAT_GRACE_SEC = 180;\n\nexport interface StatusInput {\n factoryIdentity: FactoryIdentity;\n projectCount: number;\n pluginNames: string[];\n mcpServers: Record<string, unknown>;\n hooks: Record<string, unknown[]>;\n skillCount: number;\n runDirs: string[];\n daemonPid: number | null;\n pidAlive: boolean;\n // Seconds since the last heartbeat posted to the board. null if no\n // heartbeat has ever been posted (or the board couldn't be reached).\n // When this is fresh (< DAEMON_HEARTBEAT_GRACE_SEC) the daemon is\n // considered running even if we can't see its PID from here -- this\n // is how Docker Compose / remote deployments report status.\n daemonHeartbeatAgeSec?: number | null;\n}\n\nexport interface FactoryStatus {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n counts: {\n projects: number;\n plugins: number;\n mcps: number;\n skills: number;\n hooks: number;\n };\n last_run: {\n run_id: string;\n } | null;\n daemon: {\n status: \"running\" | \"stopped\";\n pid: number | null;\n };\n}\n\nexport function collectStatus(input: StatusInput): FactoryStatus {\n const {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n daemonHeartbeatAgeSec = null,\n } = input;\n\n // Count hooks across all events\n let hookCount = 0;\n for (const entries of Object.values(hooks)) {\n hookCount += entries.length;\n }\n\n // Find most recent run (dirs are sorted ascending by name)\n const lastRun = runDirs.length > 0\n ? { run_id: runDirs[runDirs.length - 1] }\n : null;\n\n // Determine daemon status. Prefer a fresh heartbeat (works across\n // containers / remote hosts) and fall back to the local PID check.\n const heartbeatFresh =\n daemonHeartbeatAgeSec !== null &&\n daemonHeartbeatAgeSec >= 0 &&\n daemonHeartbeatAgeSec < DAEMON_HEARTBEAT_GRACE_SEC;\n const daemonStatus: \"running\" | \"stopped\" =\n heartbeatFresh || (daemonPid !== null && pidAlive) ? \"running\" : \"stopped\";\n\n return {\n factory_name: factoryIdentity.factory_name,\n engine_version: factoryIdentity.engine_version,\n schema_version: factoryIdentity.schema_version,\n created_at: factoryIdentity.created_at,\n counts: {\n projects: projectCount,\n plugins: pluginNames.length,\n mcps: Object.keys(mcpServers).length,\n skills: skillCount,\n hooks: hookCount,\n },\n last_run: lastRun,\n daemon: {\n status: daemonStatus,\n pid: daemonPid,\n },\n };\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\n\n/**\n * Coerce a string value into the appropriate JS type.\n * Used by `config set` to auto-detect booleans, numbers, null.\n */\nexport function coerceValue(raw: string): unknown {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n if (raw === \"null\") return null;\n if (raw === \"\") return raw;\n const num = Number(raw);\n if (!isNaN(num)) return num;\n return raw;\n}\n\n/**\n * Get a value from a config object using dot-notation.\n * Throws if the key path does not exist.\n */\nexport function configGet(config: Record<string, unknown>, keyPath: string): unknown {\n const parts = keyPath.split(\".\");\n let current: unknown = config;\n\n for (let i = 0; i < parts.length; i++) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n const traversed = parts.slice(0, i).join(\".\");\n throw new Error(`Key not found: ${traversed}`);\n }\n const key = parts[i];\n const obj = current as Record<string, unknown>;\n if (!(key in obj)) {\n const fullPath = parts.slice(0, i + 1).join(\".\");\n throw new Error(`Key not found: ${fullPath}`);\n }\n current = obj[key];\n }\n\n return current;\n}\n\n/**\n * Set a value in a config object using dot-notation.\n * Creates intermediate objects as needed.\n * Returns a new config object (shallow clones along the path).\n */\nexport function configSet(\n config: Record<string, unknown>,\n keyPath: string,\n value: unknown\n): Record<string, unknown> {\n const parts = keyPath.split(\".\");\n if (parts.length === 1) {\n return { ...config, [parts[0]]: value };\n }\n\n const [head, ...rest] = parts;\n const child = (config[head] !== undefined && config[head] !== null && typeof config[head] === \"object\")\n ? { ...(config[head] as Record<string, unknown>) }\n : {};\n\n return {\n ...config,\n [head]: configSet(child, rest.join(\".\"), value),\n };\n}\n\n/**\n * Generate the full default config from the Zod schema.\n */\nexport function generateDefaults(): Record<string, unknown> {\n return FactoryConfigSchema.parse({}) as unknown as Record<string, unknown>;\n}\n\n/**\n * Reset config to defaults. If keyPath is provided, reset only that path.\n * If no keyPath, reset the entire config to schema defaults.\n */\nexport function configReset(\n config: Record<string, unknown>,\n keyPath?: string\n): Record<string, unknown> {\n const defaults = generateDefaults();\n\n if (!keyPath) {\n return defaults;\n }\n\n // Get the default value at the key path\n const defaultValue = configGet(defaults, keyPath);\n return configSet(config, keyPath, defaultValue);\n}\n","import semver from \"semver\";\nimport type { FactoryIdentity } from \"./types.js\";\n\nexport interface DoctorInput {\n factoryDirExists: boolean;\n factoryIdentity: FactoryIdentity | null;\n config: Record<string, unknown> | null;\n configParseError: string | null;\n env: Record<string, string | undefined>;\n projectPaths: Array<{ name: string; path: string; exists: boolean }>;\n installedPlugins: Array<{ name: string; engine_version: string }>;\n engineVersion: string;\n portsInUse: Array<{ project: string; port: number; inUse: boolean }>;\n}\n\nexport interface DoctorCheck {\n name: string;\n status: \"pass\" | \"fail\" | \"warn\";\n message: string;\n fix?: string;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n passed: number;\n failed: number;\n warnings: number;\n}\n\nconst REQUIRED_SECRETS = [\"ANTHROPIC_API_KEY\", \"GITHUB_TOKEN\"];\n\nexport function runDiagnostics(input: DoctorInput): DoctorReport {\n const checks: DoctorCheck[] = [];\n\n // 1. Factory directory exists\n if (input.factoryDirExists) {\n checks.push({\n name: \"Factory directory\",\n status: \"pass\",\n message: \"Factory directory exists\",\n });\n } else {\n checks.push({\n name: \"Factory directory\",\n status: \"fail\",\n message: \"No .beastmode/ directory found\",\n fix: \"Run: beastmode init\",\n });\n // Early summary — downstream checks are meaningless without factory\n return summarize(checks);\n }\n\n // 2. Config schema valid\n if (input.config !== null && input.configParseError === null) {\n checks.push({\n name: \"Config schema\",\n status: \"pass\",\n message: \"Config schema is valid\",\n });\n } else {\n checks.push({\n name: \"Config schema\",\n status: \"fail\",\n message: input.configParseError || \"Config is missing or invalid\",\n fix: \"Run: beastmode validate --verbose\",\n });\n }\n\n // 3. Factory identity valid\n if (input.factoryIdentity !== null) {\n checks.push({\n name: \"Factory identity\",\n status: \"pass\",\n message: \"Factory identity is valid\",\n });\n } else {\n checks.push({\n name: \"Factory identity\",\n status: \"fail\",\n message: \"factory.json is missing or invalid\",\n fix: \"Re-run: beastmode init\",\n });\n }\n\n // 4. Secrets present\n const missingSecrets = REQUIRED_SECRETS.filter((s) => !input.env[s]);\n if (missingSecrets.length === 0) {\n checks.push({\n name: \"Secrets\",\n status: \"pass\",\n message: \"All required secrets are set\",\n });\n } else {\n checks.push({\n name: \"Secrets\",\n status: \"warn\",\n message: `Missing secrets: ${missingSecrets.join(\", \")}`,\n fix: missingSecrets.map((s) => `export ${s}=<your-value>`).join(\"\\n\"),\n });\n }\n\n // 5. Project paths accessible\n const missingProjects = input.projectPaths.filter((p) => !p.exists);\n if (missingProjects.length === 0) {\n checks.push({\n name: \"Project paths\",\n status: \"pass\",\n message: input.projectPaths.length === 0\n ? \"No projects configured\"\n : \"All project paths are accessible\",\n });\n } else {\n checks.push({\n name: \"Project paths\",\n status: \"fail\",\n message: `Missing paths: ${missingProjects.map((p) => `${p.name} (${p.path})`).join(\", \")}`,\n fix: missingProjects\n .map((p) => `Update path: beastmode config set projects.${p.name}.path <new-path>`)\n .join(\"\\n\"),\n });\n }\n\n // 6. Plugin compatibility\n const incompatible = input.installedPlugins.filter((p) => {\n try {\n return !semver.satisfies(input.engineVersion, p.engine_version);\n } catch {\n return true; // Invalid semver range treated as incompatible\n }\n });\n if (incompatible.length === 0) {\n checks.push({\n name: \"Plugin compatibility\",\n status: \"pass\",\n message: \"All plugins are compatible with engine version\",\n });\n } else {\n checks.push({\n name: \"Plugin compatibility\",\n status: \"warn\",\n message: `Incompatible plugins: ${incompatible.map((p) => `${p.name} (requires ${p.engine_version})`).join(\", \")}`,\n fix: \"Upgrade the plugin or engine to a compatible version\",\n });\n }\n\n // 7. Port conflicts\n const conflicting = input.portsInUse.filter((p) => p.inUse);\n if (conflicting.length === 0) {\n checks.push({\n name: \"Port conflicts\",\n status: \"pass\",\n message: \"No port conflicts detected\",\n });\n } else {\n checks.push({\n name: \"Port conflicts\",\n status: \"warn\",\n message: `Ports in use: ${conflicting.map((p) => `${p.project} (port ${p.port})`).join(\", \")}`,\n fix: \"Change the dev_port in project config or stop the process using the port\",\n });\n }\n\n return summarize(checks);\n}\n\nfunction summarize(checks: DoctorCheck[]): DoctorReport {\n return {\n checks,\n passed: checks.filter((c) => c.status === \"pass\").length,\n failed: checks.filter((c) => c.status === \"fail\").length,\n warnings: checks.filter((c) => c.status === \"warn\").length,\n };\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\n\nexport interface UpgradeCheck {\n current_version: string;\n latest_version: string;\n update_available: boolean;\n migration_needed: boolean;\n current_schema: number;\n latest_schema: number;\n}\n\nexport interface UpgradeResult {\n success: boolean;\n from_version: string;\n to_version: string;\n migrated: boolean;\n changes: string[];\n updatedIdentity: {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n };\n updatedConfig: Record<string, unknown>;\n}\n\n/**\n * Check if an upgrade is available by comparing factory identity\n * against the latest engine version and schema.\n */\nexport function checkUpgrade(\n factoryIdentity: { engine_version: string; schema_version: number },\n latestVersion: string,\n latestSchema: number\n): UpgradeCheck {\n return {\n current_version: factoryIdentity.engine_version,\n latest_version: latestVersion,\n update_available: factoryIdentity.engine_version !== latestVersion,\n migration_needed: factoryIdentity.schema_version !== latestSchema,\n current_schema: factoryIdentity.schema_version,\n latest_schema: latestSchema,\n };\n}\n\n/**\n * Perform an upgrade: bump version, migrate config schema, fill defaults.\n * Pure function — caller handles reading/writing files.\n */\nexport function performUpgrade(\n factoryIdentity: {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n },\n config: Record<string, unknown>,\n latestVersion: string,\n latestSchema: number\n): UpgradeResult {\n const changes: string[] = [];\n let migrated = false;\n\n const updatedIdentity = { ...factoryIdentity };\n\n // Check if there's anything to do\n const versionChanged = factoryIdentity.engine_version !== latestVersion;\n const schemaChanged = factoryIdentity.schema_version !== latestSchema;\n\n if (!versionChanged && !schemaChanged) {\n return {\n success: true,\n from_version: factoryIdentity.engine_version,\n to_version: latestVersion,\n migrated: false,\n changes: [],\n updatedIdentity,\n updatedConfig: config,\n };\n }\n\n // Bump engine version\n if (versionChanged) {\n updatedIdentity.engine_version = latestVersion;\n changes.push(`engine_version: ${factoryIdentity.engine_version} -> ${latestVersion}`);\n }\n\n // Migrate config: parse through Zod to fill in new defaults\n // This is forward-compatible — existing valid fields are preserved,\n // new fields get their schema defaults.\n const updatedConfig = FactoryConfigSchema.parse(config) as unknown as Record<string, unknown>;\n migrated = true;\n\n // Bump schema version\n if (schemaChanged) {\n updatedIdentity.schema_version = latestSchema;\n changes.push(`schema_version: ${factoryIdentity.schema_version} -> ${latestSchema}`);\n }\n\n return {\n success: true,\n from_version: factoryIdentity.engine_version,\n to_version: latestVersion,\n migrated,\n changes,\n updatedIdentity,\n updatedConfig,\n };\n}\n","import semver from \"semver\";\nimport { PluginManifestSchema } from \"./schemas.js\";\nimport type { PluginManifest } from \"./types.js\";\n\n/**\n * Parse and validate a raw object into a PluginManifest.\n * Pure function — no I/O.\n */\nexport function parseManifest(raw: unknown): PluginManifest {\n if (typeof raw !== \"object\" || raw === null) {\n throw new Error(\"Plugin manifest must be a JSON object\");\n }\n const result = PluginManifestSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid plugin manifest:\\n${issues}`);\n }\n return result.data;\n}\n\n/**\n * Check if the engine version satisfies the plugin's engine_version requirement.\n * Pure function — no I/O.\n */\nexport function checkEngineCompat(\n requiredRange: string,\n currentVersion: string\n): { compatible: boolean; reason?: string } {\n if (semver.satisfies(currentVersion, requiredRange)) {\n return { compatible: true };\n }\n return {\n compatible: false,\n reason: `Engine version ${currentVersion} does not satisfy required range '${requiredRange}'`,\n };\n}\n\n/**\n * Topological sort of plugin dependencies. Returns install order\n * (dependencies first, target last).\n * Pure function — no I/O.\n */\nexport function resolveDependencies(\n manifests: Record<string, PluginManifest>,\n target: string\n): string[] {\n const resolved: string[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n function visit(name: string, chain: string[]): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n throw new Error(\n `Circular dependency detected: ${[...chain, name].join(\" -> \")}`\n );\n }\n\n const manifest = manifests[name];\n if (!manifest) {\n throw new Error(\n `Dependency '${name}' not found in available manifests`\n );\n }\n\n visiting.add(name);\n\n for (const dep of manifest.dependencies) {\n visit(dep, [...chain, name]);\n }\n\n visiting.delete(name);\n visited.add(name);\n resolved.push(name);\n }\n\n visit(target, []);\n return resolved;\n}\n\n/**\n * Deep merge plugin defaults into base config. Base config wins on conflicts.\n * Pure function — no I/O.\n */\nexport function mergePluginDefaults(\n baseConfig: Record<string, unknown>,\n pluginDefaults: Record<string, unknown>\n): Record<string, unknown> {\n return deepMergeBaseWins(pluginDefaults, baseConfig);\n}\n\n/**\n * Deep merge where `winner` values take priority over `base` values.\n * If both sides have an object at the same key, recurse.\n * Otherwise, winner takes precedence.\n */\nfunction deepMergeBaseWins(\n base: Record<string, unknown>,\n winner: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...base };\n\n for (const key of Object.keys(winner)) {\n const baseVal = base[key];\n const winnerVal = winner[key];\n\n if (\n winnerVal !== null &&\n typeof winnerVal === \"object\" &&\n !Array.isArray(winnerVal) &&\n baseVal !== null &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMergeBaseWins(\n baseVal as Record<string, unknown>,\n winnerVal as Record<string, unknown>\n );\n } else {\n result[key] = winnerVal;\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { RegistryIndexSchema } from \"./schemas.js\";\nimport type { RegistryIndex } from \"./types.js\";\n\nconst DEFAULT_REGISTRY_URL =\n \"https://raw.githubusercontent.com/beastmode-plugins/registry/main/index.json\";\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Resolve the registry URL. Priority:\n * 1. BEASTMODE_REGISTRY_URL env var (supports file paths and URLs)\n * 2. Default remote URL\n */\nfunction getRegistryUrl(): string {\n return process.env.BEASTMODE_REGISTRY_URL || DEFAULT_REGISTRY_URL;\n}\n\n/**\n * Check if a registry URL is a local file path.\n */\nfunction isLocalPath(url: string): boolean {\n return url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"~\") || url.startsWith(\"file://\");\n}\n\n/**\n * Read registry index from a local file path.\n */\nfunction readLocalRegistry(filePath: string): RegistryIndex {\n const resolved = filePath.startsWith(\"file://\")\n ? filePath.slice(7)\n : resolve(filePath);\n if (!existsSync(resolved)) {\n throw new Error(`Local registry file not found: ${resolved}`);\n }\n const raw = JSON.parse(readFileSync(resolved, \"utf-8\"));\n return RegistryIndexSchema.parse(raw);\n}\n\ninterface CacheEntry {\n fetched_at: string;\n data: RegistryIndex;\n}\n\nexport interface PluginSource {\n type: \"local\" | \"git\" | \"registry\";\n path?: string;\n url?: string;\n name?: string;\n version?: string;\n}\n\nfunction getCachePath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \".cache\", \"registry-index.json\");\n}\n\nfunction readCache(factoryDir: string): CacheEntry | null {\n const cachePath = getCachePath(factoryDir);\n if (!existsSync(cachePath)) return null;\n try {\n return JSON.parse(readFileSync(cachePath, \"utf-8\")) as CacheEntry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(factoryDir: string, data: RegistryIndex): void {\n const cachePath = getCachePath(factoryDir);\n const cacheDir = join(factoryDir, \".beastmode\", \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n cachePath,\n JSON.stringify(\n { fetched_at: new Date().toISOString(), data } as CacheEntry,\n null,\n 2\n ),\n \"utf-8\"\n );\n}\n\nfunction isCacheFresh(cache: CacheEntry): boolean {\n const fetchedAt = new Date(cache.fetched_at).getTime();\n return Date.now() - fetchedAt < CACHE_TTL_MS;\n}\n\n/**\n * Fetch the plugin registry index. Uses cache with 1-hour TTL.\n * Falls back to stale cache on network failure.\n *\n * Supports BEASTMODE_REGISTRY_URL env var override:\n * - Local file path: reads directly, skips caching\n * - Remote URL: fetches with cache as normal\n */\nexport async function fetchRegistryIndex(\n factoryDir: string,\n options?: { noCache?: boolean }\n): Promise<RegistryIndex> {\n const noCache = options?.noCache ?? false;\n const registryUrl = getRegistryUrl();\n\n // If local file path, read directly (no caching needed)\n if (isLocalPath(registryUrl)) {\n return readLocalRegistry(registryUrl);\n }\n\n // Check cache first (unless bypassed)\n if (!noCache) {\n const cache = readCache(factoryDir);\n if (cache && isCacheFresh(cache)) {\n return cache.data;\n }\n }\n\n // Try to fetch from remote\n try {\n const response = await fetch(registryUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const raw = await response.json();\n const result = RegistryIndexSchema.parse(raw);\n writeCache(factoryDir, result);\n return result;\n } catch (fetchError) {\n // Fall back to stale cache\n const cache = readCache(factoryDir);\n if (cache) {\n return cache.data;\n }\n throw fetchError;\n }\n}\n\n/**\n * Determine the source type from a plugin source string.\n * Pure function — no I/O.\n */\nexport function resolvePluginSource(source: string): PluginSource {\n // Local paths\n if (source.startsWith(\"./\") || source.startsWith(\"/\") || source.startsWith(\"~\")) {\n return { type: \"local\", path: source };\n }\n\n // Git URLs\n if (\n source.includes(\"github.com\") ||\n source.includes(\"gitlab.com\") ||\n source.endsWith(\".git\")\n ) {\n return { type: \"git\", url: source };\n }\n\n // Registry: name or name@version\n if (source.includes(\"@\")) {\n const atIdx = source.lastIndexOf(\"@\");\n const name = source.slice(0, atIdx);\n const version = source.slice(atIdx + 1);\n return { type: \"registry\", name, version };\n }\n\n return { type: \"registry\", name: source };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { McpServerEntrySchema } from \"./schemas.js\";\nimport type { McpServerEntry } from \"./types.js\";\n\nfunction getMcpServersPath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \"mcp-servers.json\");\n}\n\nfunction readMcpServers(factoryDir: string): Record<string, McpServerEntry> {\n const filePath = getMcpServersPath(factoryDir);\n // Auto-initialize: treat a missing file as an empty registry so the UI\n // (and anything else on a fresh factory) can add the first MCP without\n // hand-editing files.\n if (!existsSync(filePath)) return {};\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return (raw.servers || {}) as Record<string, McpServerEntry>;\n}\n\nfunction writeMcpServers(\n factoryDir: string,\n servers: Record<string, McpServerEntry>\n): void {\n const filePath = getMcpServersPath(factoryDir);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, JSON.stringify({ servers }, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function addMcp(\n factoryDir: string,\n name: string,\n entry: {\n command: string;\n args: string[];\n config?: Record<string, unknown>;\n source: string;\n enabled: boolean;\n }\n): void {\n const validated = McpServerEntrySchema.parse(entry);\n const servers = readMcpServers(factoryDir);\n\n if (servers[name]) {\n throw new Error(`MCP server '${name}' already exists. Remove it first or use a different name.`);\n }\n\n servers[name] = validated;\n writeMcpServers(factoryDir, servers);\n}\n\nexport function removeMcp(factoryDir: string, name: string): void {\n const servers = readMcpServers(factoryDir);\n\n if (!servers[name]) {\n throw new Error(`MCP server '${name}' not found.`);\n }\n\n delete servers[name];\n writeMcpServers(factoryDir, servers);\n}\n\nexport function listMcps(\n factoryDir: string\n): Record<string, McpServerEntry> {\n return readMcpServers(factoryDir);\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { HookEntrySchema, HOOK_EVENTS } from \"./schemas.js\";\nimport type { HookEntry, HookEvent } from \"./types.js\";\n\nfunction getHooksPath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \"hooks.json\");\n}\n\nfunction validateEvent(event: string): asserts event is HookEvent {\n if (!(HOOK_EVENTS as readonly string[]).includes(event)) {\n throw new Error(\n `Invalid hook event '${event}'. Valid events: ${HOOK_EVENTS.join(\", \")}`\n );\n }\n}\n\nfunction emptyHooks(): Record<HookEvent, HookEntry[]> {\n const out: Record<string, HookEntry[]> = {};\n for (const e of HOOK_EVENTS) out[e] = [];\n return out as Record<HookEvent, HookEntry[]>;\n}\n\nfunction readHooks(\n factoryDir: string\n): Record<HookEvent, HookEntry[]> {\n const filePath = getHooksPath(factoryDir);\n // Auto-initialize: treat a missing file as an empty hook registry so the\n // UI (and anything else on a fresh factory) can add the first hook\n // without hand-editing files.\n if (!existsSync(filePath)) return emptyHooks();\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return (raw.hooks || emptyHooks()) as Record<HookEvent, HookEntry[]>;\n}\n\nfunction writeHooks(\n factoryDir: string,\n hooks: Record<HookEvent, HookEntry[]>\n): void {\n const filePath = getHooksPath(factoryDir);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(\n filePath,\n JSON.stringify({ hooks }, null, 2) + \"\\n\",\n \"utf-8\"\n );\n}\n\nexport function addHook(\n factoryDir: string,\n event: HookEvent,\n entry: {\n name: string;\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n source: string;\n }\n): void {\n validateEvent(event);\n const validated = HookEntrySchema.parse(entry);\n const hooks = readHooks(factoryDir);\n\n const eventHooks = hooks[event] || [];\n if (eventHooks.some((h) => h.name === validated.name)) {\n throw new Error(\n `Hook '${validated.name}' already exists on event '${event}'. Remove it first or use a different name.`\n );\n }\n\n eventHooks.push(validated);\n hooks[event] = eventHooks;\n writeHooks(factoryDir, hooks);\n}\n\nexport function removeHook(\n factoryDir: string,\n event: HookEvent,\n name: string\n): void {\n validateEvent(event);\n const hooks = readHooks(factoryDir);\n\n const eventHooks = hooks[event] || [];\n const index = eventHooks.findIndex((h) => h.name === name);\n if (index === -1) {\n throw new Error(\n `Hook '${name}' not found on event '${event}'.`\n );\n }\n\n eventHooks.splice(index, 1);\n hooks[event] = eventHooks;\n writeHooks(factoryDir, hooks);\n}\n\nexport function listHooks(\n factoryDir: string\n): Record<HookEvent, HookEntry[]> {\n return readHooks(factoryDir);\n}\n","import {\n existsSync,\n readFileSync,\n writeFileSync,\n cpSync,\n rmSync,\n mkdirSync,\n} from \"fs\";\nimport { join, resolve } from \"path\";\nimport { parseManifest, checkEngineCompat, mergePluginDefaults } from \"./plugin-resolver.js\";\nimport { addMcp, removeMcp, listMcps } from \"./mcp-manager.js\";\nimport { addHook, removeHook, listHooks } from \"./hook-manager.js\";\nimport { ENGINE_VERSION } from \"./version.js\";\nimport type { PluginManifest, HookEvent } from \"./types.js\";\nimport { HOOK_EVENTS } from \"./schemas.js\";\n\nfunction readLock(factoryDir: string): {\n plugins: Record<string, { version: string; source: string; repo?: string; ref?: string; installed_at: string }>;\n locked_at: string;\n} {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n return { plugins: {}, locked_at: new Date().toISOString() };\n }\n return JSON.parse(readFileSync(lockPath, \"utf-8\"));\n}\n\nfunction writeLock(\n factoryDir: string,\n lock: {\n plugins: Record<string, { version: string; source: string; repo?: string; ref?: string; installed_at: string }>;\n locked_at: string;\n }\n): void {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n lock.locked_at = new Date().toISOString();\n writeFileSync(lockPath, JSON.stringify(lock, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) return {};\n return JSON.parse(readFileSync(configPath, \"utf-8\"));\n}\n\nfunction writeConfig(factoryDir: string, config: Record<string, unknown>): void {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction registerPluginMcps(\n factoryDir: string,\n pluginName: string,\n pluginDir: string,\n manifest: PluginManifest\n): void {\n const mcpNames = manifest.provides?.mcp_servers || [];\n for (const mcpName of mcpNames) {\n const mcpDefPath = join(pluginDir, \"mcp-servers\", `${mcpName}.json`);\n if (!existsSync(mcpDefPath)) continue;\n\n const mcpDef = JSON.parse(readFileSync(mcpDefPath, \"utf-8\"));\n addMcp(factoryDir, mcpName, {\n command: mcpDef.command,\n args: mcpDef.args || [],\n config: mcpDef.config || {},\n source: `plugin:${pluginName}`,\n enabled: true,\n });\n }\n}\n\nfunction registerPluginHooks(\n factoryDir: string,\n pluginName: string,\n pluginDir: string,\n manifest: PluginManifest\n): void {\n const hookNames = manifest.provides?.hooks || [];\n for (const hookName of hookNames) {\n const hookDefPath = join(pluginDir, \"hooks\", `${hookName}.json`);\n if (!existsSync(hookDefPath)) continue;\n\n const hookDef = JSON.parse(readFileSync(hookDefPath, \"utf-8\"));\n const event = hookDef.event as HookEvent;\n if (!(HOOK_EVENTS as readonly string[]).includes(event)) continue;\n\n addHook(factoryDir, event, {\n name: hookDef.name || hookName,\n command: hookDef.command,\n skill: hookDef.skill,\n webhook: hookDef.webhook,\n config: hookDef.config || {},\n source: `plugin:${pluginName}`,\n });\n }\n}\n\nfunction unregisterPluginMcps(factoryDir: string, pluginName: string): void {\n const servers = listMcps(factoryDir);\n for (const [name, entry] of Object.entries(servers)) {\n if (entry.source === `plugin:${pluginName}`) {\n removeMcp(factoryDir, name);\n }\n }\n}\n\nfunction unregisterPluginHooks(factoryDir: string, pluginName: string): void {\n const allHooks = listHooks(factoryDir);\n for (const event of HOOK_EVENTS) {\n const eventHooks = allHooks[event] || [];\n for (const hook of eventHooks) {\n if (hook.source === `plugin:${pluginName}`) {\n removeHook(factoryDir, event, hook.name);\n }\n }\n }\n}\n\n/**\n * Install a plugin from a local path.\n * Validates manifest, checks engine compat, copies files,\n * registers MCPs/hooks, merges defaults, updates lock.\n */\nexport async function installPlugin(\n factoryDir: string,\n sourcePath: string\n): Promise<void> {\n const resolvedPath = resolve(sourcePath);\n\n // 1. Validate plugin.json exists\n const manifestPath = join(resolvedPath, \"plugin.json\");\n if (!existsSync(manifestPath)) {\n throw new Error(\n `plugin.json not found at ${manifestPath}. Is this a BeastMode plugin directory?`\n );\n }\n\n // 2. Parse and validate manifest\n const rawManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n const manifest = parseManifest(rawManifest);\n\n // 3. Check engine compatibility\n const compat = checkEngineCompat(manifest.engine_version, ENGINE_VERSION);\n if (!compat.compatible) {\n throw new Error(\n `Plugin '${manifest.name}' is not compatible with this engine version. ${compat.reason}`\n );\n }\n\n // 4. Check if already installed\n const lock = readLock(factoryDir);\n if (lock.plugins[manifest.name]) {\n throw new Error(\n `Plugin '${manifest.name}' is already installed. Remove it first with 'beastmode remove plugin ${manifest.name}'.`\n );\n }\n\n // 5. Copy plugin to .beastmode/plugins/<name>/\n const destDir = join(factoryDir, \".beastmode\", \"plugins\", manifest.name);\n mkdirSync(destDir, { recursive: true });\n cpSync(resolvedPath, destDir, { recursive: true });\n\n // 6. Register MCP servers\n registerPluginMcps(factoryDir, manifest.name, destDir, manifest);\n\n // 7. Register hooks\n registerPluginHooks(factoryDir, manifest.name, destDir, manifest);\n\n // 8. Merge config defaults (low priority — existing values preserved)\n if (manifest.config_defaults) {\n const defaultsPath = join(destDir, manifest.config_defaults);\n if (existsSync(defaultsPath)) {\n const defaults = JSON.parse(readFileSync(defaultsPath, \"utf-8\"));\n const currentConfig = readConfig(factoryDir);\n const mergedConfig = mergePluginDefaults(currentConfig, defaults);\n writeConfig(factoryDir, mergedConfig);\n }\n }\n\n // 9. Update extensions.lock\n lock.plugins[manifest.name] = {\n version: manifest.version,\n source: \"local\",\n installed_at: new Date().toISOString(),\n };\n writeLock(factoryDir, lock);\n}\n\n/**\n * Remove an installed plugin. Cleans up MCPs, hooks, files, and lock entry.\n */\nexport function removePlugin(\n factoryDir: string,\n name: string,\n options?: { force?: boolean }\n): void {\n const lock = readLock(factoryDir);\n const force = options?.force ?? false;\n\n // Check if installed\n if (!lock.plugins[name]) {\n throw new Error(\n `Plugin '${name}' is not installed.`\n );\n }\n\n // Check if other plugins depend on this one\n if (!force) {\n const dependents: string[] = [];\n const pluginsDir = join(factoryDir, \".beastmode\", \"plugins\");\n for (const [pluginName, _entry] of Object.entries(lock.plugins)) {\n if (pluginName === name) continue;\n const pluginManifestPath = join(pluginsDir, pluginName, \"plugin.json\");\n if (!existsSync(pluginManifestPath)) continue;\n try {\n const pluginManifest = JSON.parse(readFileSync(pluginManifestPath, \"utf-8\"));\n if (\n Array.isArray(pluginManifest.dependencies) &&\n pluginManifest.dependencies.includes(name)\n ) {\n dependents.push(pluginName);\n }\n } catch {\n // skip unreadable manifests\n }\n }\n if (dependents.length > 0) {\n throw new Error(\n `Cannot remove '${name}': plugins [${dependents.join(\", \")}] depend on it. Use --force to override.`\n );\n }\n }\n\n // Remove plugin's MCP servers\n unregisterPluginMcps(factoryDir, name);\n\n // Remove plugin's hooks\n unregisterPluginHooks(factoryDir, name);\n\n // Delete plugin directory\n const pluginDir = join(factoryDir, \".beastmode\", \"plugins\", name);\n if (existsSync(pluginDir)) {\n rmSync(pluginDir, { recursive: true, force: true });\n }\n\n // Update lock\n delete lock.plugins[name];\n writeLock(factoryDir, lock);\n}\n","import {\n existsSync,\n readdirSync,\n cpSync,\n rmSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n statSync,\n} from \"fs\";\nimport { join, basename } from \"path\";\n\nexport interface SkillInfo {\n name: string;\n description: string;\n source: string; // \"custom\" | \"plugin:<name>\"\n path: string;\n}\n\nfunction parseSkillFrontmatter(content: string): { name?: string; description?: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n const frontmatter: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n frontmatter[key] = value;\n }\n }\n return frontmatter;\n}\n\nexport function addSkill(factoryDir: string, sourcePath: string): void {\n if (!existsSync(sourcePath)) {\n throw new Error(`Skill source path does not exist: ${sourcePath}`);\n }\n\n const stat = statSync(sourcePath);\n if (!stat.isDirectory()) {\n throw new Error(`Skill source must be a directory: ${sourcePath}`);\n }\n\n const skillMdPath = join(sourcePath, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n throw new Error(\n `SKILL.md not found in ${sourcePath}. Every skill must have a SKILL.md with frontmatter.`\n );\n }\n\n const skillName = basename(sourcePath);\n const destPath = join(factoryDir, \".beastmode\", \"skills\", skillName);\n\n if (existsSync(destPath)) {\n throw new Error(\n `Skill '${skillName}' already exists at ${destPath}. Remove it first.`\n );\n }\n\n cpSync(sourcePath, destPath, { recursive: true });\n}\n\n/**\n * Create a new skill inline from name/description/body (for the UI form).\n *\n * Unlike `addSkill` which copies an existing directory, this one generates\n * a `.beastmode/skills/<slug>/SKILL.md` from raw inputs. Slug is derived\n * from the name (lowercased, non-alnum -> dashes). Fails if the slug\n * already exists — caller should remove the old one first.\n */\nexport function createSkill(\n factoryDir: string,\n name: string,\n description: string,\n body: string,\n): { slug: string; path: string } {\n if (!name.trim()) throw new Error(\"Skill name is required\");\n if (!description.trim()) throw new Error(\"Skill description is required\");\n if (!body.trim()) throw new Error(\"Skill body is required\");\n\n const slug = name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (!slug) throw new Error(\"Skill name must contain alphanumeric characters\");\n\n const skillDir = join(factoryDir, \".beastmode\", \"skills\", slug);\n if (existsSync(skillDir)) {\n throw new Error(\n `Skill '${slug}' already exists. Remove it first or pick a different name.`,\n );\n }\n\n mkdirSync(skillDir, { recursive: true });\n\n // Build SKILL.md with YAML frontmatter. Quote values that contain colons.\n const needsQuote = (v: string) => /[:#]/.test(v);\n const q = (v: string) => (needsQuote(v) ? JSON.stringify(v) : v);\n const frontmatter = `---\\nname: ${q(name.trim())}\\ndescription: ${q(description.trim())}\\n---`;\n const content = `${frontmatter}\\n\\n${body.trim()}\\n`;\n writeFileSync(join(skillDir, \"SKILL.md\"), content, \"utf-8\");\n\n return { slug, path: skillDir };\n}\n\nexport function removeSkill(factoryDir: string, name: string): void {\n const skillPath = join(factoryDir, \".beastmode\", \"skills\", name);\n if (!existsSync(skillPath)) {\n throw new Error(`Skill '${name}' not found at ${skillPath}.`);\n }\n rmSync(skillPath, { recursive: true, force: true });\n}\n\nexport function listSkills(factoryDir: string): SkillInfo[] {\n const skills: SkillInfo[] = [];\n const bmDir = join(factoryDir, \".beastmode\");\n\n // Custom skills from .beastmode/skills/\n const customSkillsDir = join(bmDir, \"skills\");\n if (existsSync(customSkillsDir)) {\n for (const entry of readdirSync(customSkillsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\")) continue;\n const skillMdPath = join(customSkillsDir, entry.name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n\n const frontmatter = parseSkillFrontmatter(\n readFileSync(skillMdPath, \"utf-8\")\n );\n skills.push({\n name: frontmatter.name || entry.name,\n description: frontmatter.description || \"\",\n source: \"custom\",\n path: join(customSkillsDir, entry.name),\n });\n }\n }\n\n // Plugin skills from .beastmode/plugins/*/skills/*/\n const pluginsDir = join(bmDir, \"plugins\");\n if (existsSync(pluginsDir)) {\n for (const pluginEntry of readdirSync(pluginsDir, {\n withFileTypes: true,\n })) {\n if (!pluginEntry.isDirectory() || pluginEntry.name.startsWith(\".\"))\n continue;\n const pluginSkillsDir = join(\n pluginsDir,\n pluginEntry.name,\n \"skills\"\n );\n if (!existsSync(pluginSkillsDir)) continue;\n\n for (const skillEntry of readdirSync(pluginSkillsDir, {\n withFileTypes: true,\n })) {\n if (!skillEntry.isDirectory() || skillEntry.name.startsWith(\".\"))\n continue;\n const skillMdPath = join(\n pluginSkillsDir,\n skillEntry.name,\n \"SKILL.md\"\n );\n if (!existsSync(skillMdPath)) continue;\n\n const frontmatter = parseSkillFrontmatter(\n readFileSync(skillMdPath, \"utf-8\")\n );\n skills.push({\n name: frontmatter.name || skillEntry.name,\n description: frontmatter.description || \"\",\n source: `plugin:${pluginEntry.name}`,\n path: join(pluginSkillsDir, skillEntry.name),\n });\n }\n }\n }\n\n return skills;\n}\n","/**\n * Migrate engine: converts daemon config to factory config format.\n * Pure functions — no I/O. CLI layer handles file reads/writes.\n */\n\nimport type { FactoryConfig, ProjectConfig, FileAction } from \"./types.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"./schemas.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\n// ── Types ──\n\nexport interface DaemonConfigRaw {\n mode?: string;\n task_backend?: string;\n board?: { url?: string };\n github?: {\n project_repo?: string;\n base_branch?: string;\n org?: string;\n infra_repo?: string;\n gitops_repo?: string;\n pr_auto_merge?: boolean;\n };\n ci?: Record<string, unknown>;\n deploy?: Record<string, unknown>;\n repos?: {\n beastmode?: string;\n project?: string;\n infra?: string;\n gitops?: string;\n };\n infra?: Record<string, unknown>;\n verification?: {\n enabled?: boolean;\n satisfaction_threshold?: number;\n timeout_minutes?: number;\n prod_accept_floor?: number;\n };\n convergence?: {\n max_iterations?: number;\n fail_fast_threshold?: number;\n infra_retry_max?: number;\n max_precheck_retries?: number;\n };\n models?: Record<string, unknown>;\n cost?: {\n build_check_enabled?: boolean;\n incremental_verification?: boolean;\n model_tiering_enabled?: boolean;\n [k: string]: unknown;\n };\n retry?: { max_failures?: number };\n healing?: { enabled?: boolean; max_attempts?: number };\n review?: { enabled?: boolean; timeout_minutes?: number };\n stack?: {\n name?: string;\n build_command?: string;\n dev_command?: string;\n test_command?: string;\n install_command?: string;\n dev_port?: number;\n };\n docker?: Record<string, unknown>;\n sre?: Record<string, unknown>;\n concurrency?: Record<string, unknown>;\n}\n\nexport interface ActiveState {\n activeRuns: string[];\n worktrees: string[];\n totalRuns: number;\n}\n\nexport interface MigrationReport {\n factoryName: string;\n projectName: string | null;\n configMappings: Array<{ from: string; to: string; value: unknown }>;\n droppedKeys: string[];\n activeState: ActiveState;\n filesCreated: string[];\n}\n\n// ── Config Parsing ──\n\nexport function parseDaemonConfig(jsonContent: string): DaemonConfigRaw {\n return JSON.parse(jsonContent) as DaemonConfigRaw;\n}\n\n// ── Config Mapping ──\n\nexport function mapDaemonToFactory(daemon: DaemonConfigRaw): {\n factory: FactoryConfig;\n project: ProjectConfig | null;\n} {\n // Map task backend\n let adapter = \"beastmode-board\";\n const taskBackendConfig: Record<string, unknown> = {};\n\n if (daemon.task_backend === \"board\") {\n adapter = \"beastmode-board\";\n if (daemon.board) {\n Object.assign(taskBackendConfig, daemon.board);\n }\n }\n\n // Map models\n const models: Record<string, string> = {};\n if (daemon.models) {\n const m = daemon.models as Record<string, string | null>;\n if (m.spec) models.spec = m.spec;\n if (m.coder_initial) models.coder = m.coder_initial;\n if (m.coder_iteration) models.coder_iteration = m.coder_iteration;\n if (m.verifier) models.verifier = m.verifier;\n if (m.review) models.reviewer = m.review;\n if (m.healing) models.healing = m.healing;\n }\n\n // Build factory config object (let Zod fill defaults)\n const factoryRaw: Record<string, unknown> = {\n pipeline: {\n satisfaction_threshold: daemon.verification?.satisfaction_threshold ?? 0.85,\n prod_accept_floor: daemon.verification?.prod_accept_floor ?? 0.65,\n max_iterations: daemon.convergence?.max_iterations ?? 5,\n fail_fast_threshold: daemon.convergence?.fail_fast_threshold ?? 0.3,\n },\n models: Object.keys(models).length > 0 ? models : undefined,\n task_backend: {\n adapter,\n config: taskBackendConfig,\n },\n resilience: {\n max_failures: daemon.retry?.max_failures ?? 5,\n healing_enabled: daemon.healing?.enabled ?? true,\n healing_max_attempts: daemon.healing?.max_attempts ?? 3,\n },\n cost: {\n model_tiering_enabled: daemon.cost?.model_tiering_enabled ?? true,\n incremental_verification: daemon.cost?.incremental_verification ?? true,\n build_check_enabled: daemon.cost?.build_check_enabled ?? true,\n },\n human_gates: {\n pr_review: daemon.review?.enabled !== false ? \"automated\" : \"disabled\",\n },\n };\n\n // Remove undefined keys\n for (const [k, v] of Object.entries(factoryRaw)) {\n if (v === undefined) delete factoryRaw[k];\n }\n\n const factory = FactoryConfigSchema.parse(factoryRaw) as FactoryConfig;\n\n // Build project config if we have repo/path info\n let project: ProjectConfig | null = null;\n if (daemon.repos?.project || daemon.github?.project_repo) {\n const repoName = daemon.github?.project_repo?.split(\"/\").pop() || \"project\";\n const stack = daemon.stack || {};\n\n const deployConfig: Record<string, unknown> = {};\n if (daemon.deploy) {\n for (const [k, v] of Object.entries(daemon.deploy)) {\n if (v !== null && v !== undefined) {\n deployConfig[k] = v;\n }\n }\n }\n\n const hasDeployConfig = Object.keys(deployConfig).length > 0;\n\n const projectRaw = {\n name: repoName,\n repo: daemon.github?.project_repo || \"\",\n path: daemon.repos?.project || \"\",\n stack: {\n detected: stack.name || \"node\",\n build_command: stack.build_command || \"npm run build\",\n dev_command: stack.dev_command || \"npm run dev\",\n test_command: stack.test_command || \"npm test\",\n install_command: stack.install_command || \"npm install\",\n dev_port: stack.dev_port || 3000,\n },\n deploy: {\n target: hasDeployConfig ? \"aws-ecs\" : \"pr-only\",\n config: deployConfig,\n },\n pipeline: {},\n models: {},\n plugins: [] as string[],\n };\n\n project = ProjectConfigSchema.parse(projectRaw) as ProjectConfig;\n }\n\n return { factory, project };\n}\n\n// ── Active State Inventory ──\n\nexport interface RunCheckpoint {\n run_id?: string;\n current_stage?: string;\n completed_stages?: unknown[];\n iteration_count?: number;\n}\n\nexport function inventoryActiveState(\n runDirs: string[],\n checkpoints: Map<string, RunCheckpoint>,\n worktreeOutput: string\n): ActiveState {\n const terminalStages = [\"done\", \"shipped\", \"failed\", \"stuck\"];\n\n const activeRuns = runDirs.filter((dir) => {\n const cp = checkpoints.get(dir);\n if (!cp || !cp.current_stage) return false;\n const stage = String(cp.current_stage).toLowerCase();\n return !terminalStages.includes(stage);\n });\n\n const worktrees = worktreeOutput\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => line.split(/\\s+/)[0])\n .filter(Boolean);\n\n return {\n activeRuns,\n worktrees,\n totalRuns: runDirs.length,\n };\n}\n\n// ── Migration Generation ──\n\nconst DROPPED_KEYS = [\n \"mode\",\n \"concurrency\",\n \"docker\",\n \"sre\",\n \"ci\",\n \"infra\",\n \"repos.beastmode\",\n \"repos.infra\",\n \"repos.gitops\",\n];\n\nexport function generateMigration(\n factoryName: string,\n daemon: DaemonConfigRaw,\n activeState: ActiveState\n): { files: FileAction[]; report: MigrationReport } {\n const { factory, project } = mapDaemonToFactory(daemon);\n const files: FileAction[] = [];\n const bm = \".beastmode\";\n\n // factory.json\n files.push({\n path: `${bm}/factory.json`,\n content: JSON.stringify(\n {\n factory_name: factoryName,\n engine_version: ENGINE_VERSION,\n schema_version: SCHEMA_VERSION,\n created_at: new Date().toISOString(),\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // config.json\n files.push({\n path: `${bm}/config.json`,\n content: JSON.stringify(factory, null, 2),\n action: \"create\",\n });\n\n // project config\n if (project) {\n files.push({\n path: `${bm}/projects/${project.name}.json`,\n content: JSON.stringify(project, null, 2),\n action: \"create\",\n });\n }\n\n // hooks.json\n files.push({\n path: `${bm}/hooks.json`,\n content: JSON.stringify(\n {\n hooks: {\n \"pre-spec\": [],\n \"post-spec\": [],\n \"pre-plan\": [],\n \"post-plan\": [],\n \"pre-build\": [],\n \"post-build\": [],\n \"pre-verify\": [],\n \"post-verify\": [],\n \"pre-ship\": [],\n \"post-ship\": [],\n \"on-convergence\": [],\n \"on-failure\": [],\n \"on-stuck\": [],\n },\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // mcp-servers.json\n files.push({\n path: `${bm}/mcp-servers.json`,\n content: JSON.stringify({ servers: {} }, null, 2),\n action: \"create\",\n });\n\n // extensions.lock\n files.push({\n path: `${bm}/extensions.lock`,\n content: JSON.stringify(\n { plugins: {}, locked_at: new Date().toISOString() },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // board.json\n files.push({\n path: `${bm}/board.json`,\n content: JSON.stringify({ items: [] }, null, 2),\n action: \"create\",\n });\n\n // Empty directories\n for (const dir of [\"plugins\", \"skills\"]) {\n files.push({\n path: `${bm}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n // Build config mappings for report\n const configMappings: MigrationReport[\"configMappings\"] = [];\n\n if (daemon.task_backend) {\n configMappings.push({\n from: \"task_backend\",\n to: \"task_backend.adapter\",\n value: factory.task_backend.adapter,\n });\n }\n if (daemon.verification?.satisfaction_threshold !== undefined) {\n configMappings.push({\n from: \"verification.satisfaction_threshold\",\n to: \"pipeline.satisfaction_threshold\",\n value: factory.pipeline.satisfaction_threshold,\n });\n }\n if (daemon.verification?.prod_accept_floor !== undefined) {\n configMappings.push({\n from: \"verification.prod_accept_floor\",\n to: \"pipeline.prod_accept_floor\",\n value: factory.pipeline.prod_accept_floor,\n });\n }\n if (daemon.convergence?.max_iterations !== undefined) {\n configMappings.push({\n from: \"convergence.max_iterations\",\n to: \"pipeline.max_iterations\",\n value: factory.pipeline.max_iterations,\n });\n }\n\n const report: MigrationReport = {\n factoryName,\n projectName: project?.name || null,\n configMappings,\n droppedKeys: DROPPED_KEYS.filter((k) => {\n const parts = k.split(\".\");\n let obj: unknown = daemon;\n for (const p of parts) {\n if (obj && typeof obj === \"object\" && p in (obj as Record<string, unknown>)) {\n obj = (obj as Record<string, unknown>)[p];\n } else {\n return false;\n }\n }\n return true;\n }),\n activeState,\n filesCreated: files.map((f) => f.path),\n };\n\n return { files, report };\n}\n","/**\n * Bridge engine: generates daemon-compatible config from factory config.\n * Reverse of migrator — maps factory format back to daemon JSON.\n * Pure functions — no I/O.\n */\n\nimport type { FactoryConfig, ProjectConfig } from \"./types.js\";\n\n// ── Types ──\n\nexport interface DaemonJson {\n mode: string;\n task_backend: string;\n board: { url: string };\n github: {\n org: string;\n project_repo: string;\n infra_repo: string | null;\n gitops_repo: string | null;\n base_branch: string;\n pr_auto_merge: boolean;\n };\n ci: {\n provider: string;\n poll_interval_seconds: number;\n timeout_minutes: number;\n };\n deploy: Record<string, unknown>;\n repos: {\n beastmode: string;\n project: string;\n infra: string | null;\n gitops: string | null;\n };\n infra: {\n terraform_dir: string;\n playbooks_dir: string;\n aws_region: string;\n };\n verification: {\n enabled: boolean;\n satisfaction_threshold: number;\n timeout_minutes: number;\n prod_accept_floor: number;\n };\n review: {\n enabled: boolean;\n timeout_minutes: number;\n };\n retry: { max_failures: number };\n healing: { enabled: boolean; max_attempts: number };\n concurrency: { enabled: boolean; max_playwright_sessions: number };\n docker: {\n build_verify_enabled: boolean;\n verify_port: number;\n build_timeout_seconds: number;\n };\n convergence: {\n max_iterations: number;\n fail_fast_threshold: number;\n infra_retry_max: number;\n max_precheck_retries: number;\n };\n models: Record<string, string | null>;\n cost: {\n build_check_enabled: boolean;\n build_check_command: string;\n build_check_timeout_seconds: number;\n incremental_verification: boolean;\n model_tiering_enabled: boolean;\n nlspec_precheck_enabled: boolean;\n nlspec_precheck_model: string;\n };\n sre: Record<string, unknown>;\n stack: {\n name: string;\n build_command: string;\n dev_command: string;\n test_command: string;\n install_command: string;\n dev_port: number;\n };\n}\n\n// ── Generate daemon config ──\n\nexport function generateDaemonConfig(\n factoryConfig: FactoryConfig,\n projectConfig: ProjectConfig | null,\n factoryPath: string\n): Record<string, unknown> {\n const pipeline = factoryConfig.pipeline;\n const models = factoryConfig.models;\n const resilience = factoryConfig.resilience;\n const cost = factoryConfig.cost;\n const taskBackend = factoryConfig.task_backend;\n const humanGates = factoryConfig.human_gates;\n\n // Determine task backend adapter\n const backendAdapter = taskBackend.adapter;\n let taskBackendValue = \"board\";\n if (backendAdapter === \"beastmode-board\") {\n taskBackendValue = \"board\";\n } else {\n taskBackendValue = backendAdapter;\n }\n\n // Board config (env var overrides for Docker)\n const boardUrl =\n process.env.BEASTMODE_BOARD_URL ||\n ((taskBackend.config as Record<string, unknown>)?.url as string) ||\n \"http://127.0.0.1:8080\";\n\n // Project details\n const projectRepo = projectConfig?.repo || \"\";\n const projectPath = projectConfig?.path || \"\";\n const projectOrg = projectRepo.split(\"/\")[0] || \"beastmode-agent\";\n\n // Stack\n const stack = projectConfig?.stack;\n\n // Deploy\n const deployConfig: Record<string, unknown> = {};\n if (projectConfig?.deploy?.config) {\n Object.assign(deployConfig, projectConfig.deploy.config);\n }\n\n // Models mapping: factory -> daemon\n const daemonModels: Record<string, string | null> = {\n coder_initial: models.coder !== \"claude-opus-4-6\" ? models.coder : null,\n coder_iteration: models.coder_iteration,\n verifier: models.verifier,\n review: models.reviewer,\n spec: models.spec !== \"claude-opus-4-6\" ? models.spec : null,\n healing: models.healing,\n };\n\n const result: Record<string, unknown> = {\n mode: \"daemon\",\n task_backend: taskBackendValue,\n board: {\n url: boardUrl,\n },\n github: {\n org: projectOrg,\n project_repo: projectRepo,\n infra_repo: null,\n gitops_repo: null,\n base_branch: \"main\",\n pr_auto_merge: false,\n },\n ci: {\n provider: \"github-actions\",\n poll_interval_seconds: 30,\n timeout_minutes: 30,\n },\n deploy: Object.keys(deployConfig).length > 0 ? deployConfig : {\n ecr_repository: null,\n ecs_cluster: null,\n ecs_service: null,\n health_check_url: null,\n },\n repos: {\n beastmode: factoryPath,\n project: projectPath,\n infra: null,\n gitops: null,\n },\n infra: {\n terraform_dir: \"infra\",\n playbooks_dir: \"infra/playbooks\",\n aws_region: \"us-east-1\",\n },\n verification: {\n enabled: true,\n satisfaction_threshold: pipeline.satisfaction_threshold,\n timeout_minutes: 30,\n prod_accept_floor: pipeline.prod_accept_floor,\n },\n review: {\n enabled: humanGates.pr_review !== \"disabled\",\n timeout_minutes: 15,\n },\n retry: {\n max_failures: resilience.max_failures,\n },\n healing: {\n enabled: resilience.healing_enabled,\n max_attempts: resilience.healing_max_attempts,\n },\n concurrency: {\n enabled: true,\n max_playwright_sessions: 1,\n },\n docker: {\n build_verify_enabled: true,\n verify_port: 3001,\n build_timeout_seconds: 600,\n },\n convergence: {\n max_iterations: pipeline.max_iterations,\n fail_fast_threshold: pipeline.fail_fast_threshold,\n infra_retry_max: 3,\n max_precheck_retries: 2,\n },\n models: daemonModels,\n cost: {\n build_check_enabled: cost.build_check_enabled,\n build_check_command: stack?.build_command || \"npm run build\",\n build_check_timeout_seconds: 180,\n incremental_verification: cost.incremental_verification,\n model_tiering_enabled: cost.model_tiering_enabled,\n nlspec_precheck_enabled: true,\n nlspec_precheck_model: \"claude-haiku-4-5-20251001\",\n },\n sre: {\n enabled: false,\n },\n stack: {\n name: stack?.detected || \"node\",\n build_command: stack?.build_command || \"npm run build\",\n dev_command: stack?.dev_command || \"npm run dev\",\n test_command: stack?.test_command || \"npm test\",\n install_command: stack?.install_command || \"npm install\",\n dev_port: stack?.dev_port || 3000,\n },\n };\n\n return result;\n}\n\n// ── Find Python Daemon ──\n\nexport interface DaemonLocation {\n command: string;\n args: string[];\n}\n\nexport function findPythonDaemonPaths(\n envPath: string | undefined,\n factoryPath: string\n): string[] {\n const paths: string[] = [];\n\n // 1. BEASTMODE_DAEMON_PATH env var\n if (envPath) {\n paths.push(envPath);\n }\n\n // 2. Relative to factory path (common layout: factory/../daemon)\n paths.push(`${factoryPath}/daemon`);\n paths.push(`${factoryPath}/../daemon`);\n\n return paths;\n}\n\nexport function buildDaemonCommand(\n daemonPath: string | null,\n configPath: string,\n options: { dryRun?: boolean; logLevel?: string } = {}\n): { command: string; args: string[] } {\n const args: string[] = [];\n\n if (daemonPath) {\n args.push(\"-m\", \"beastmode_daemon\");\n } else {\n args.push(\"-m\", \"beastmode_daemon\");\n }\n\n args.push(\"--config\", configPath);\n\n if (options.dryRun) {\n args.push(\"--dry-run\");\n }\n\n if (options.logLevel) {\n args.push(\"--log-level\", options.logLevel);\n }\n\n return {\n command: \"python\",\n args,\n };\n}\n","// Methodology Integration — engine modules\nexport { getStageProvider, validateProvider, listProviders, parseMethodologyManifest } from \"./provider-manager.js\";\nexport { resolveImportAdapter, runImportAdapter } from \"./import-adapter.js\";\nexport { resolveExportAdapter, runExportAdapter } from \"./export-adapter.js\";\nexport { importPrd, importUserStories, importRfc, importTestCases, exportMarkdown } from \"./builtin-adapters.js\";\nexport type { ProviderInfo, BuiltinProviderInfo, PluginProviderInfo, ProviderValidationResult } from \"./provider-manager.js\";\nexport type { ImportAdapterRef, BuiltinImportAdapterRef, PluginImportAdapterRef } from \"./import-adapter.js\";\nexport type { ExportAdapterRef, BuiltinExportAdapterRef, PluginExportAdapterRef } from \"./export-adapter.js\";\n\n// Config Engine — pure logic, no I/O\nexport { detectStack } from \"./stack-detector.js\";\nexport { PRESETS, getPreset, listPresets } from \"./presets.js\";\nexport { resolveDefaults, resolveProject } from \"./default-resolver.js\";\nexport { validateSecrets } from \"./secret-validator.js\";\nexport { scaffoldFactory } from \"./scaffold-generator.js\";\nexport { parseTemplate } from \"./template-importer.js\";\nexport { validateFactory } from \"./config-validator.js\";\nexport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\n// Lifecycle — status, config, doctor, upgrade\nexport { collectStatus } from \"./status-checker.js\";\nexport type { StatusInput, FactoryStatus } from \"./status-checker.js\";\nexport { configGet, configSet, configReset, coerceValue, generateDefaults } from \"./config-manager.js\";\nexport { runDiagnostics } from \"./doctor.js\";\nexport type { DoctorInput, DoctorCheck, DoctorReport } from \"./doctor.js\";\nexport { checkUpgrade, performUpgrade } from \"./upgrader.js\";\nexport type { UpgradeCheck, UpgradeResult } from \"./upgrader.js\";\n\n// Extension System — engine modules\nexport { parseManifest, checkEngineCompat, resolveDependencies, mergePluginDefaults } from \"./plugin-resolver.js\";\nexport { fetchRegistryIndex, resolvePluginSource } from \"./plugin-registry.js\";\nexport { installPlugin, removePlugin } from \"./plugin-installer.js\";\nexport { addMcp, removeMcp, listMcps } from \"./mcp-manager.js\";\nexport { addHook, removeHook, listHooks } from \"./hook-manager.js\";\nexport { addSkill, createSkill, removeSkill, listSkills } from \"./skill-manager.js\";\n\nexport {\n FactoryConfigSchema,\n ProjectConfigSchema,\n FactoryIdentitySchema,\n PipelineConfigSchema,\n ModelsConfigSchema,\n TaskBackendConfigSchema,\n StageConfigSchema,\n StackConfigSchema,\n DeployConfigSchema,\n PluginManifestSchema,\n McpServerEntrySchema,\n HookEntrySchema,\n RegistryIndexSchema,\n RegistryEntrySchema,\n ExtensionsLockSchema,\n LockEntrySchema,\n HookEventSchema,\n HOOK_EVENTS,\n MethodologyManifestSchema,\n ProviderEntrySchema,\n ImportAdapterEntrySchema,\n ExportAdapterEntrySchema,\n MethodologyPresetEntrySchema,\n PROVIDER_CONTRACTS,\n PIPELINE_STAGES,\n ARTIFACT_TYPES,\n} from \"./schemas.js\";\nexport type {\n FactoryConfig,\n ProjectConfig,\n FactoryIdentity,\n StackInfo,\n FileAction,\n ConfigDelta,\n ValidationError,\n SecretReport,\n SecretRequirement,\n PluginManifest,\n McpServerEntry,\n HookEntry,\n RegistryIndex,\n RegistryEntry,\n ExtensionsLock,\n LockEntry,\n HookEvent,\n MethodologyManifest,\n ProviderEntry,\n ImportAdapterEntry,\n ExportAdapterEntry,\n MethodologyPresetEntry,\n} from \"./types.js\";\nexport type { SkillInfo } from \"./skill-manager.js\";\nexport type { PluginSource } from \"./plugin-registry.js\";\n\n// Migrator + Bridge — daemon config translation\nexport {\n parseDaemonConfig,\n mapDaemonToFactory,\n inventoryActiveState,\n generateMigration,\n} from \"./migrator.js\";\nexport type {\n DaemonConfigRaw,\n ActiveState,\n MigrationReport,\n RunCheckpoint,\n} from \"./migrator.js\";\nexport {\n generateDaemonConfig,\n findPythonDaemonPaths,\n buildDaemonCommand,\n} from \"./bridge.js\";\nexport type { DaemonLocation } from \"./bridge.js\";\n","import { mkdirSync, writeFileSync, appendFileSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport type { FileAction } from \"../../engine/types.js\";\n\nexport function executeFileActions(actions: FileAction[]): void {\n for (const action of actions) {\n const dir = dirname(action.path);\n mkdirSync(dir, { recursive: true });\n\n switch (action.action) {\n case \"create\":\n if (existsSync(action.path)) {\n throw new Error(`File already exists: ${action.path}`);\n }\n writeFileSync(action.path, action.content, \"utf-8\");\n break;\n case \"overwrite\":\n writeFileSync(action.path, action.content, \"utf-8\");\n break;\n case \"append\":\n appendFileSync(action.path, action.content, \"utf-8\");\n break;\n }\n }\n}\n","import chalk from \"chalk\";\n\nexport function header(text: string): void {\n console.log();\n console.log(chalk.bold.cyan(` ${text}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(text.length + 2)));\n}\n\nexport function success(text: string): void {\n console.log(chalk.green(` ✓ ${text}`));\n}\n\nexport function warn(text: string): void {\n console.log(chalk.yellow(` ⚠ ${text}`));\n}\n\nexport function error(text: string): void {\n console.log(chalk.red(` ✗ ${text}`));\n}\n\nexport function info(text: string): void {\n console.log(chalk.dim(` ${text}`));\n}\n\nexport function step(n: number, total: number, text: string): void {\n console.log();\n console.log(chalk.bold(` [${n}/${total}] ${text}`));\n}\n","import {\n detectStack,\n listPresets,\n getPreset,\n resolveDefaults,\n validateSecrets,\n scaffoldFactory,\n ENGINE_VERSION,\n} from \"../../engine/index.js\";\nimport { executeFileActions } from \"../utils/file-writer.js\";\nimport { resolve, basename } from \"path\";\nimport { existsSync, writeFileSync } from \"fs\";\nimport type { StackInfo } from \"../../engine/types.js\";\n\nexport interface Route {\n method: \"GET\" | \"POST\";\n path: string;\n handler: (body?: unknown) => Promise<unknown> | unknown;\n}\n\nconst DEPLOY_TARGETS = [\n \"pr-only\",\n \"vercel\",\n \"aws-ecs\",\n \"aws-lambda\",\n \"gcp-cloud-run\",\n \"kubernetes\",\n \"docker-compose\",\n \"static-host\",\n \"custom\",\n];\n\nconst TASK_BACKENDS = [\n { value: \"beastmode-board\", label: \"BeastMode Board (built-in, zero setup)\" },\n { value: \"github-issues\", label: \"GitHub Issues\" },\n { value: \"linear\", label: \"Linear (requires plugin)\" },\n { value: \"jira\", label: \"Jira (requires plugin)\" },\n];\n\nexport function getRoutes(): Route[] {\n return [\n {\n method: \"GET\",\n path: \"/api/health\",\n handler: () => ({ status: \"ok\", version: ENGINE_VERSION, service: \"beastmode-board\" }),\n },\n {\n method: \"POST\",\n path: \"/api/detect-stack\",\n handler: (body) => {\n const { path: projectPath } = body as { path: string };\n if (!projectPath) throw new Error(\"Missing required field: path\");\n const resolved = resolve(projectPath);\n if (!existsSync(resolved)) throw new Error(`Directory not found: ${resolved}`);\n return detectStack(resolved);\n },\n },\n {\n method: \"GET\",\n path: \"/api/presets\",\n handler: () => {\n return listPresets().map((name) => {\n const preset = getPreset(name);\n return {\n name,\n description: preset.description,\n satisfaction_threshold: preset.satisfaction_threshold,\n max_iterations: preset.max_iterations,\n };\n });\n },\n },\n {\n method: \"GET\",\n path: \"/api/deploy-targets\",\n handler: () => DEPLOY_TARGETS,\n },\n {\n method: \"GET\",\n path: \"/api/task-backends\",\n handler: () => TASK_BACKENDS,\n },\n {\n method: \"POST\",\n path: \"/api/validate-secrets\",\n handler: (body) => {\n const { config, env, context } = body as {\n config: Record<string, unknown>;\n env: Record<string, string>;\n context: { deploy_target?: string };\n };\n if (!config) throw new Error(\"Missing required field: config\");\n // Merge server env with provided env (server env has lower priority)\n const mergedEnv = { ...(process.env as Record<string, string>), ...env };\n const resolvedConfig = resolveDefaults(config, { suggested_preset: \"lean\" } as StackInfo);\n return validateSecrets(resolvedConfig, mergedEnv, context || {});\n },\n },\n {\n method: \"POST\",\n path: \"/api/resolve-defaults\",\n handler: (body) => {\n const { partial, stack } = body as {\n partial: Record<string, unknown>;\n stack: StackInfo;\n };\n if (!partial) throw new Error(\"Missing required field: partial\");\n if (!stack) throw new Error(\"Missing required field: stack\");\n return resolveDefaults(partial, stack);\n },\n },\n {\n method: \"POST\",\n path: \"/api/scaffold\",\n handler: (body) => {\n const { name, config, project, secrets } = body as {\n name: string;\n config: Record<string, unknown>;\n project: {\n name: string;\n repo?: string;\n path: string;\n stack: StackInfo;\n deploy_target?: string;\n };\n secrets?: Record<string, string>;\n };\n\n if (!name) throw new Error(\"Missing required field: name\");\n if (!config) throw new Error(\"Missing required field: config\");\n if (!project) throw new Error(\"Missing required field: project\");\n\n // Check factory doesn't already exist\n if (existsSync(name) && existsSync(resolve(name, \".beastmode\"))) {\n throw new Error(`Factory already exists at ./${name}. Use 'beastmode config' to modify.`);\n }\n\n // Resolve the full config\n const resolvedConfig = resolveDefaults(config, project.stack);\n\n // Scaffold\n const actions = scaffoldFactory(name, resolvedConfig, {\n name: project.name,\n repo: project.repo,\n path: project.path,\n stack: project.stack,\n deploy_target: project.deploy_target,\n });\n\n executeFileActions(actions);\n\n // Write secrets if provided\n if (secrets && Object.keys(secrets).length > 0) {\n const secretLines = Object.entries(secrets)\n .filter(([, val]) => val)\n .map(([key, val]) => `${key}=${val}`);\n if (secretLines.length > 0) {\n const secretsPath = resolve(name, \".beastmode\", \"secrets.env.local\");\n const secretsContent =\n \"# BeastMode secrets — DO NOT COMMIT\\n\" + secretLines.join(\"\\n\") + \"\\n\";\n writeFileSync(secretsPath, secretsContent, \"utf-8\");\n }\n }\n\n const fileList = actions\n .filter((a) => !a.path.endsWith(\".gitkeep\"))\n .map((a) => a.path.replace(`${name}/`, \"\"));\n\n return {\n success: true,\n files: fileList,\n factory_path: resolve(name),\n };\n },\n },\n ];\n}\n","import { existsSync, mkdirSync, readdirSync, renameSync, readFileSync, statSync, writeFileSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\n\nexport function archiveOldRuns(runsDir: string, archiveAfterDays: number): { archived: number } {\n if (archiveAfterDays <= 0 || !existsSync(runsDir)) return { archived: 0 };\n\n const archiveDir = join(runsDir, \".archive\");\n const cutoff = Date.now() - archiveAfterDays * 24 * 60 * 60 * 1000;\n let archived = 0;\n\n for (const entry of readdirSync(runsDir)) {\n if (entry.startsWith(\".\") || !entry.startsWith(\"run-\")) continue;\n const runDir = join(runsDir, entry);\n\n // Skip if pinned\n if (existsSync(join(runDir, \"pinned\"))) continue;\n\n // Check if completed (has checkpoint with stage \"done\" or \"ship\")\n const cpPath = join(runDir, \"checkpoint.json\");\n if (!existsSync(cpPath)) continue;\n try {\n const cp = JSON.parse(readFileSync(cpPath, \"utf-8\"));\n const stage = (cp.current_stage || \"\").toLowerCase();\n if (stage !== \"done\" && stage !== \"ship\") continue;\n } catch { continue; }\n\n // Check age\n try {\n const mtime = statSync(cpPath).mtimeMs;\n if (mtime > cutoff) continue;\n } catch { continue; }\n\n // Archive it\n mkdirSync(archiveDir, { recursive: true });\n renameSync(runDir, join(archiveDir, entry));\n archived++;\n }\n\n return { archived };\n}\n\nexport function pinRun(runsDir: string, runId: string): boolean {\n const runDir = join(runsDir, runId);\n if (!existsSync(runDir)) return false;\n writeFileSync(join(runDir, \"pinned\"), new Date().toISOString());\n return true;\n}\n\nexport function unpinRun(runsDir: string, runId: string): boolean {\n const pinFile = join(runsDir, runId, \"pinned\");\n if (!existsSync(pinFile)) return false;\n unlinkSync(pinFile);\n return true;\n}\n\nexport function isRunPinned(runsDir: string, runId: string): boolean {\n return existsSync(join(runsDir, runId, \"pinned\"));\n}\n","// cli/src/cli/ui/inception.ts\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// ── Types ──\n\nexport interface PhaseState {\n id: string;\n name: string;\n status: \"pending\" | \"in_progress\" | \"approved\";\n artifact: string;\n approvedAt?: string;\n}\n\nexport interface InceptionState {\n productName: string;\n idea: string;\n methodology: string;\n interactionMode: \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\";\n currentPhase: number;\n phases: PhaseState[];\n status: string;\n createdAt: string;\n projectName: string | null;\n}\n\nexport interface MethodologyPhase {\n id: string;\n name: string;\n agent_role: string;\n description: string;\n artifact: string;\n artifact_details_dir?: string;\n prompt_template: string;\n}\n\nexport interface Methodology {\n id: string;\n name: string;\n description: string;\n phases: MethodologyPhase[];\n}\n\n// ── Methodology Loading ──\n\nfunction getMethodologiesDir(): string {\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"methodologies\"),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"methodologies\"),\n join(process.cwd(), \"src\", \"cli\", \"ui\", \"methodologies\"),\n join(process.cwd(), \"dist\", \"methodologies\"),\n join(process.cwd(), \"cli\", \"src\", \"cli\", \"ui\", \"methodologies\"),\n join(process.cwd(), \"cli\", \"dist\", \"methodologies\"),\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) return dir;\n }\n return candidates[0]; // return first candidate even if missing — will fail gracefully\n}\n\nexport function getMethodology(id: string): Methodology {\n const dir = getMethodologiesDir();\n const filePath = join(dir, `${id.replace(/_/g, \"-\")}.json`);\n if (!existsSync(filePath)) {\n throw new Error(`Methodology not found: ${id}`);\n }\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Methodology;\n}\n\nexport function listMethodologies(): Array<{ id: string; name: string; description: string }> {\n const dir = getMethodologiesDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n const m = JSON.parse(readFileSync(join(dir, f), \"utf-8\"));\n return { id: m.id, name: m.name, description: m.description };\n } catch {\n return null;\n }\n })\n .filter(Boolean) as Array<{ id: string; name: string; description: string }>;\n}\n\n// ── Product Directory ──\n\nfunction getProductDir(factoryDir: string, productName: string): string {\n return join(factoryDir, \".beastmode\", \"products\", productName);\n}\n\n// ── State Management ──\n\nexport function createInceptionState(\n factoryDir: string,\n opts: {\n productName: string;\n idea: string;\n methodology: string;\n interactionMode: \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\";\n },\n): InceptionState {\n const methodology = getMethodology(opts.methodology);\n const productDir = getProductDir(factoryDir, opts.productName);\n mkdirSync(productDir, { recursive: true });\n\n const state: InceptionState = {\n productName: opts.productName,\n idea: opts.idea,\n methodology: opts.methodology,\n interactionMode: opts.interactionMode,\n currentPhase: 0,\n phases: methodology.phases.map((p) => ({\n id: p.id,\n name: p.name,\n status: \"pending\" as const,\n artifact: p.artifact,\n })),\n status: `phase_0_pending`,\n createdAt: new Date().toISOString(),\n projectName: null,\n };\n\n writeFileSync(join(productDir, \"inception.json\"), JSON.stringify(state, null, 2) + \"\\n\");\n return state;\n}\n\nexport function loadInception(factoryDir: string, productName: string): InceptionState | null {\n const filePath = join(getProductDir(factoryDir, productName), \"inception.json\");\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as InceptionState;\n } catch {\n return null;\n }\n}\n\nexport function saveInceptionState(factoryDir: string, state: InceptionState): void {\n const productDir = getProductDir(factoryDir, state.productName);\n writeFileSync(join(productDir, \"inception.json\"), JSON.stringify(state, null, 2) + \"\\n\");\n}\n\nexport function advancePhase(factoryDir: string, productName: string): InceptionState {\n const state = loadInception(factoryDir, productName);\n if (!state) throw new Error(`No inception found for: ${productName}`);\n\n const current = state.phases[state.currentPhase];\n current.status = \"approved\";\n current.approvedAt = new Date().toISOString();\n\n if (state.currentPhase < state.phases.length - 1) {\n state.currentPhase++;\n state.phases[state.currentPhase].status = \"in_progress\";\n state.status = `phase_${state.currentPhase}_in_progress`;\n } else {\n state.status = \"completed\";\n }\n\n saveInceptionState(factoryDir, state);\n return state;\n}\n\nexport function saveArtifact(\n factoryDir: string,\n productName: string,\n filename: string,\n content: string,\n): void {\n const productDir = getProductDir(factoryDir, productName);\n mkdirSync(productDir, { recursive: true });\n // Support subdirectories (e.g., epic-details/epic-01.md)\n const filePath = join(productDir, filename);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n}\n\nexport function loadArtifact(factoryDir: string, productName: string, filename: string): string | null {\n const filePath = join(getProductDir(factoryDir, productName), filename);\n if (!existsSync(filePath)) return null;\n return readFileSync(filePath, \"utf-8\");\n}\n\nexport function migrateInceptionToSession(factoryDir: string, productName: string): boolean {\n const productDir = join(factoryDir, \".beastmode\", \"products\", productName);\n const oldInception = join(productDir, \"inception.json\");\n if (!existsSync(oldInception)) return false;\n\n // Already migrated?\n const sessionsDir = join(productDir, \"sessions\");\n if (existsSync(sessionsDir) && readdirSync(sessionsDir).some(d => d.startsWith(\"session-\"))) {\n return false;\n }\n\n // Create session-001 from existing flat inception\n const sessionDir = join(sessionsDir, \"session-001\");\n mkdirSync(sessionDir, { recursive: true });\n\n // Move inception.json\n const content = readFileSync(oldInception, \"utf-8\");\n writeFileSync(join(sessionDir, \"inception.json\"), content);\n\n // Move any artifacts (prd.md, architecture.md, etc.)\n const artifactFiles = [\"prd.md\", \"architecture.md\", \"discovery-report.md\", \"lean-canvas.md\",\n \"mvp-spec.md\", \"brd.md\", \"technical-spec.md\", \"epics.json\", \"project-plan.md\"];\n for (const file of artifactFiles) {\n const src = join(productDir, file);\n if (existsSync(src)) {\n writeFileSync(join(sessionDir, file), readFileSync(src, \"utf-8\"));\n unlinkSync(src);\n }\n }\n\n // Remove old inception.json (now in session dir)\n unlinkSync(oldInception);\n\n return true;\n}\n\nexport function listProducts(\n factoryDir: string,\n): Array<{ name: string; methodology: string; status: string; currentPhase: number }> {\n const productsDir = join(factoryDir, \".beastmode\", \"products\");\n if (!existsSync(productsDir)) return [];\n return readdirSync(productsDir)\n .filter((d) => existsSync(join(productsDir, d, \"inception.json\")))\n .map((d) => {\n try {\n const state = JSON.parse(readFileSync(join(productsDir, d, \"inception.json\"), \"utf-8\"));\n return {\n name: state.productName || d,\n methodology: state.methodology || \"unknown\",\n status: state.status || \"unknown\",\n currentPhase: state.currentPhase || 0,\n };\n } catch {\n return null;\n }\n })\n .filter(Boolean) as Array<{ name: string; methodology: string; status: string; currentPhase: number }>;\n}\n\n// ── Epic Creation Handoff ──\n\nexport async function createEpicsOnBoard(\n factoryDir: string,\n productName: string,\n boardUrl: string = \"http://127.0.0.1:8080\",\n): Promise<{ created: number; projectName: string }> {\n const state = loadInception(factoryDir, productName);\n if (!state) throw new Error(`No inception found: ${productName}`);\n\n // Load epics.json\n const epicsContent = loadArtifact(factoryDir, productName, \"epics.json\");\n if (!epicsContent) throw new Error(\"No epics.json found — decomposition phase not complete\");\n\n let epics: Array<{\n id: string;\n name: string;\n description: string;\n complexity: string;\n depends_on: string[];\n order: number;\n }>;\n try {\n epics = JSON.parse(epicsContent);\n } catch {\n throw new Error(\"Invalid epics.json format\");\n }\n\n // Sort by order\n epics.sort((a, b) => a.order - b.order);\n\n const http = await import(\"http\");\n const createdIds: string[] = [];\n\n for (const epic of epics) {\n // Load detailed spec if available\n const detailContent = loadArtifact(factoryDir, productName, `epic-details/${epic.id}.md`) || epic.description;\n\n // Create board item\n const payload = JSON.stringify({\n name: epic.name,\n status: \"Ready\",\n task_type: \"epic\",\n priority: epic.complexity === \"XL\" ? \"Critical\" : epic.complexity === \"L\" ? \"High\" : epic.complexity === \"M\" ? \"Medium\" : \"Low\",\n });\n\n let itemId = \"\";\n try {\n const itemResult = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const url = new URL(\"/api/items\", boardUrl);\n const req = http.default.request(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(payload).toString() },\n }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => { try { resolve(JSON.parse(data)); } catch { reject(new Error(data)); } });\n });\n req.on(\"error\", reject);\n req.end(payload);\n });\n\n itemId = String(itemResult.id || \"\");\n } catch {\n // If one epic fails, continue with the rest\n continue;\n }\n\n if (itemId) {\n createdIds.push(itemId);\n\n // Post the detailed spec as the first update\n const updatePayload = JSON.stringify({ body: detailContent, creator_name: \"beastmode-inception\" });\n await new Promise<void>((resolve) => {\n const url = new URL(`/api/items/${itemId}/updates`, boardUrl);\n const req = http.default.request(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(updatePayload).toString() },\n }, () => resolve());\n req.on(\"error\", () => resolve());\n req.end(updatePayload);\n });\n }\n }\n\n // Update inception state\n state.projectName = productName;\n state.status = \"epics_created\";\n saveInceptionState(factoryDir, state);\n\n return { created: createdIds.length, projectName: productName };\n}\n\n// ── Interaction Mode Instructions ──\n\nexport function getInteractionInstructions(mode: string): string {\n switch (mode) {\n case \"interactive\":\n return \"INTERACTIVE MODE: Ask the user questions ONE AT A TIME to deeply understand their needs. Wait for their answer before proceeding. Use Socratic questioning to draw out requirements they haven't thought of. Build the artifact incrementally through dialogue. When you have enough information, present a draft and ask for feedback.\";\n case \"semi_autonomous\":\n return \"SEMI-AUTONOMOUS MODE: Generate a complete draft based on the product idea. Present it to the user as a finished document. Ask if they want to modify anything. Iterate based on their feedback until they approve.\";\n case \"fully_autonomous\":\n return \"FULLY AUTONOMOUS MODE: Generate the complete artifact without stopping to ask questions. Make reasonable product decisions based on the idea description. Present the final output for review.\";\n default:\n return \"\";\n }\n}\n\n// ── Prompt Building ──\n\nexport function buildPhasePrompt(\n state: InceptionState,\n artifacts: Record<string, string>,\n): string {\n const methodology = getMethodology(state.methodology);\n const phase = methodology.phases[state.currentPhase];\n\n let prompt = phase.prompt_template;\n\n // Replace template variables\n prompt = prompt.replace(/\\{idea\\}/g, state.idea);\n prompt = prompt.replace(/\\{interaction_mode\\}/g, state.interactionMode);\n prompt = prompt.replace(/\\{interaction_instructions\\}/g, getInteractionInstructions(state.interactionMode));\n\n // Replace artifact references\n for (const [key, content] of Object.entries(artifacts)) {\n const varName = key.replace(/[-\\.]/g, \"_\").replace(/\\.md$/, \"\");\n prompt = prompt.replace(new RegExp(`\\\\{${varName}\\\\}`, \"g\"), content || \"(not yet available)\");\n }\n\n // Replace any remaining unreplaced variables with \"(not yet available)\"\n prompt = prompt.replace(/\\{[a-z_]+\\}/g, \"(not yet available)\");\n\n return prompt;\n}\n","// cli/src/cli/ui/strategy.ts\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { getMethodology } from \"./inception.js\";\n\n// ── Types ──\n\nexport interface StrategySession {\n sessionId: string;\n name: string;\n idea: string;\n methodology: string;\n interactionMode: string;\n status: string;\n currentPhase: number;\n phases: Array<{ id: string; name: string; status: string; artifact: string }>;\n createdAt: string;\n updatedAt: string;\n buildOnSession?: string;\n sessionType?: string; // feature, architecture, refactor, product, review, free-form\n approach?: string; // auto, superpowers, bmad, lean-startup, design-thinking, traditional-prd\n}\n\nexport interface ArtifactEntry {\n type: \"brownfield\" | \"strategy_session\" | \"nlspec\" | \"satisfaction\" | \"learning\";\n path: string;\n summary: string;\n date: string;\n sessionId?: string;\n runId?: string;\n}\n\nexport interface ArtifactIndex {\n project: string;\n builtAt: string;\n artifacts: ArtifactEntry[];\n stats: {\n totalSessions: number;\n totalRuns: number;\n activeLearnings: number;\n };\n}\n\n// ── Strategy Space ──\n\nfunction getProductDir(factoryDir: string, projectName: string): string {\n return join(factoryDir, \".beastmode\", \"products\", projectName);\n}\n\nfunction getSessionsDir(factoryDir: string, projectName: string): string {\n return join(getProductDir(factoryDir, projectName), \"sessions\");\n}\n\nfunction nextSessionId(factoryDir: string, projectName: string): string {\n const sessionsDir = getSessionsDir(factoryDir, projectName);\n if (!existsSync(sessionsDir)) return \"session-001\";\n const existing = readdirSync(sessionsDir)\n .filter(d => d.startsWith(\"session-\"))\n .sort();\n if (existing.length === 0) return \"session-001\";\n const lastNum = parseInt(existing[existing.length - 1].replace(\"session-\", \"\"), 10);\n return `session-${String(lastNum + 1).padStart(3, \"0\")}`;\n}\n\nexport function createStrategySession(\n factoryDir: string,\n projectName: string,\n opts: {\n name: string;\n idea: string;\n methodology: string;\n interactionMode: string;\n buildOnSession?: string;\n sessionType?: string;\n approach?: string;\n },\n): StrategySession {\n const methodology = getMethodology(opts.methodology);\n\n const sessionId = nextSessionId(factoryDir, projectName);\n const sessionDir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(sessionDir, { recursive: true });\n\n const session: StrategySession = {\n sessionId,\n name: opts.name,\n idea: opts.idea,\n methodology: opts.methodology,\n interactionMode: opts.interactionMode,\n status: \"phase_0_pending\",\n currentPhase: 0,\n phases: methodology.phases.map((p: { id: string; name: string; artifact: string }) => ({\n id: p.id,\n name: p.name,\n status: \"pending\",\n artifact: p.artifact,\n })),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n buildOnSession: opts.buildOnSession,\n sessionType: opts.sessionType || \"free-form\",\n approach: opts.approach || \"auto\",\n };\n\n writeFileSync(join(sessionDir, \"inception.json\"), JSON.stringify(session, null, 2) + \"\\n\");\n return session;\n}\n\nexport function listStrategySessions(\n factoryDir: string,\n projectName: string,\n): StrategySession[] {\n const sessionsDir = getSessionsDir(factoryDir, projectName);\n if (!existsSync(sessionsDir)) return [];\n return readdirSync(sessionsDir)\n .filter(d => d.startsWith(\"session-\"))\n .sort()\n .map(d => {\n const file = join(sessionsDir, d, \"inception.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf-8\")) as StrategySession;\n } catch {\n return null;\n }\n })\n .filter(Boolean) as StrategySession[];\n}\n\nexport function loadStrategySession(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n): StrategySession | null {\n const file = join(getSessionsDir(factoryDir, projectName), sessionId, \"inception.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf-8\")) as StrategySession;\n } catch {\n return null;\n }\n}\n\nexport function saveStrategySession(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n session: StrategySession,\n): void {\n const dir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(dir, { recursive: true });\n session.updatedAt = new Date().toISOString();\n writeFileSync(join(dir, \"inception.json\"), JSON.stringify(session, null, 2) + \"\\n\");\n}\n\nexport function saveSessionArtifact(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n filename: string,\n content: string,\n): void {\n const dir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, filename), content);\n}\n\nexport function loadSessionArtifact(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n filename: string,\n): string | null {\n const file = join(getSessionsDir(factoryDir, projectName), sessionId, filename);\n if (!existsSync(file)) return null;\n return readFileSync(file, \"utf-8\");\n}\n\n// ── Artifact Index ──\n\nexport function buildArtifactIndex(\n factoryDir: string,\n projectName: string,\n): ArtifactIndex {\n const artifacts: ArtifactEntry[] = [];\n\n // 1. Brownfield analysis\n const brownfieldPath = join(factoryDir, \".beastmode\", \"projects\", projectName, \"brownfield.md\");\n if (existsSync(brownfieldPath)) {\n const content = readFileSync(brownfieldPath, \"utf-8\");\n const firstLine = content.split(\"\\n\").find(l => l.trim() && !l.startsWith(\"#\")) || \"\";\n artifacts.push({\n type: \"brownfield\",\n path: brownfieldPath,\n summary: firstLine.slice(0, 200),\n date: statSync(brownfieldPath).mtime.toISOString(),\n });\n }\n\n // 2. Strategy sessions\n const sessions = listStrategySessions(factoryDir, projectName);\n for (const session of sessions) {\n artifacts.push({\n type: \"strategy_session\",\n path: join(getSessionsDir(factoryDir, projectName), session.sessionId),\n summary: `${session.name} (${session.methodology}) — ${session.status}`,\n date: session.createdAt,\n sessionId: session.sessionId,\n });\n }\n\n // 3. Run NLSpecs (scan project-scoped runs)\n const runsDir = join(factoryDir, \"runs\", projectName);\n if (existsSync(runsDir)) {\n const runDirs = readdirSync(runsDir).filter(d => d.startsWith(\"run-\")).sort().reverse().slice(0, 10);\n for (const runId of runDirs) {\n const nlspecPath = join(runsDir, runId, \"nlspec.md\");\n if (existsSync(nlspecPath)) {\n const content = readFileSync(nlspecPath, \"utf-8\");\n const title = content.split(\"\\n\").find(l => l.startsWith(\"# \")) || runId;\n artifacts.push({\n type: \"nlspec\",\n path: nlspecPath,\n summary: title.replace(\"# \", \"\").slice(0, 200),\n date: statSync(nlspecPath).mtime.toISOString(),\n runId,\n });\n }\n }\n }\n\n // 4. Learnings\n const learningsDir = join(getProductDir(factoryDir, projectName), \"learnings\");\n if (existsSync(learningsDir)) {\n const learningFiles = readdirSync(learningsDir).filter(f => f.endsWith(\".md\") && !f.startsWith(\".\"));\n for (const file of learningFiles) {\n const filePath = join(learningsDir, file);\n const content = readFileSync(filePath, \"utf-8\");\n const firstHeading = content.split(\"\\n\").find(l => l.startsWith(\"## \")) || file;\n artifacts.push({\n type: \"learning\",\n path: filePath,\n summary: firstHeading.replace(\"## \", \"\").slice(0, 200),\n date: statSync(filePath).mtime.toISOString(),\n });\n }\n }\n\n return {\n project: projectName,\n builtAt: new Date().toISOString(),\n artifacts,\n stats: {\n totalSessions: sessions.length,\n totalRuns: artifacts.filter(a => a.type === \"nlspec\").length,\n activeLearnings: artifacts.filter(a => a.type === \"learning\").length,\n },\n };\n}\n","/**\n * Chat handler: manages Claude conversations via Anthropic API with\n * server-side tool execution. All tools execute automatically — Claude\n * never needs user permission.\n *\n * Tools read from the local board API (http://127.0.0.1:8080) and\n * factory filesystem. No Monday.com, no external APIs, no curl.\n */\n\nimport type { ChildProcess } from \"child_process\";\nimport type { IncomingMessage } from \"http\";\nimport type { Duplex } from \"stream\";\nimport { randomUUID } from \"crypto\";\nimport { execSync } from \"child_process\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport http from \"http\";\nimport { WebSocketServer, WebSocket as WsWebSocket } from \"ws\";\nimport { loadInception, saveArtifact, buildPhasePrompt, getMethodology, advancePhase, loadArtifact } from \"./inception.js\";\n\n// ── Types ──\n\ninterface ConversationMessage {\n role: \"user\" | \"assistant\";\n content: string | Array<{ type: string; [key: string]: unknown }>;\n}\n\nexport interface ChatSession {\n id: string;\n process: ChildProcess | null;\n socket: WsWebSocket | null;\n createdAt: number;\n factoryPath: string;\n claudeSessionId: string | null;\n busy: boolean;\n messageQueue: string[];\n conversationHistory: ConversationMessage[];\n backend: \"api\" | \"cli\" | null;\n sessionType: \"chat\" | \"inception\";\n sessionTypePrompt?: string;\n inception?: {\n productName: string;\n factoryDir: string;\n mode?: \"quick_brainstorm\";\n };\n}\n\nexport interface ChatManager {\n sessions: Map<string, ChatSession>;\n startSession(factoryPath: string): ChatSession;\n stopSession(sessionId: string): void;\n handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void;\n shutdown(): void;\n}\n\n// ── Token usage capture (Story 3 / S09) ──\n//\n// Ring buffer of the most recent Claude token-usage records surfaced by\n// the chat paths. Read via GET /api/token-usage/recent on the UI server\n// for debug/observability. Recording helpers are intentionally\n// best-effort — failures never propagate out of the chat loop.\n\nexport interface TokenUsageRecord {\n timestamp: string;\n model: string;\n input_tokens: number;\n output_tokens: number;\n cache_read_tokens: number;\n cache_creation_tokens: number;\n total_tokens: number;\n session_id: string;\n source: \"api\" | \"cli\";\n}\n\nconst MAX_RECENT_USAGE = 100;\nconst recentTokenUsage: TokenUsageRecord[] = [];\n\nexport function recordTokenUsage(record: TokenUsageRecord): void {\n recentTokenUsage.push(record);\n if (recentTokenUsage.length > MAX_RECENT_USAGE) {\n recentTokenUsage.shift();\n }\n}\n\nexport function getRecentTokenUsage(): TokenUsageRecord[] {\n return recentTokenUsage.slice();\n}\n\n// ── Board API helper ──\n\nfunction boardGet(path: string, boardUrl: string): Promise<string> {\n return new Promise((resolve) => {\n const url = new URL(path, boardUrl);\n const req = http.request(url, { method: \"GET\", timeout: 5000 }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => resolve(data));\n });\n req.on(\"error\", (err) => resolve(`Board API error: ${err.message}`));\n req.on(\"timeout\", () => { req.destroy(); resolve(\"Board API timeout\"); });\n req.end();\n });\n}\n\n// ── Tool definitions ──\n\ninterface ToolDef {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\nfunction getToolDefinitions(): ToolDef[] {\n return [\n {\n name: \"factory_status\",\n description: \"Get factory overview: projects, runs, daemon status, extension counts\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"factory_config\",\n description: \"Read factory configuration (pipeline, models, cost, resilience settings)\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"board_items\",\n description: \"Get all tasks from the BeastMode board with their status, priority, type, and timestamps. This is the task management board — use this for any question about tasks, status, or work items.\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"board_item_updates\",\n description: \"Get comments/updates posted on a specific board item\",\n input_schema: {\n type: \"object\",\n properties: {\n item_id: { type: \"string\", description: \"Item ID from the board\" },\n },\n required: [\"item_id\"],\n },\n },\n {\n name: \"list_runs\",\n description: \"List pipeline runs with checkpoint status and satisfaction scores\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"run_detail\",\n description: \"Get detailed run info: manifest, checkpoint, iteration satisfaction scores\",\n input_schema: {\n type: \"object\",\n properties: {\n run_id: { type: \"string\", description: \"Run ID (directory name under runs/)\" },\n },\n required: [\"run_id\"],\n },\n },\n {\n name: \"read_run_file\",\n description: \"Read a file from a run directory (nlspec.md, plan.md, scenarios/*.md, iterations/001/satisfaction.json)\",\n input_schema: {\n type: \"object\",\n properties: {\n run_id: { type: \"string\", description: \"Run ID\" },\n file_path: { type: \"string\", description: \"Relative path within the run directory\" },\n },\n required: [\"run_id\", \"file_path\"],\n },\n },\n {\n name: \"list_projects\",\n description: \"List registered projects with their path, stack, and configuration\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"read_file\",\n description: \"Read a file from the factory directory. Path is relative to factory root. Max 10KB returned.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File path relative to factory root\" },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"list_directory\",\n description: \"List contents of a directory in the factory. Path is relative to factory root.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Directory path relative to factory root (empty for root)\" },\n },\n required: [\"path\"],\n },\n },\n ];\n}\n\n// ── Tool execution ──\n\nfunction readJsonSafe(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction getBoardUrl(factoryPath: string): string {\n // Env var overrides all (used in Docker to point at internal board service)\n if (process.env.BEASTMODE_BOARD_URL) return process.env.BEASTMODE_BOARD_URL;\n const configPath = join(factoryPath, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.task_backend?.config?.url) return config.task_backend.config.url;\n } catch { /* ignore */ }\n }\n return \"http://127.0.0.1:8080\";\n}\n\nasync function executeTool(\n toolName: string,\n toolInput: Record<string, unknown>,\n factoryPath: string,\n): Promise<string> {\n try {\n switch (toolName) {\n case \"factory_status\": {\n const bmDir = join(factoryPath, \".beastmode\");\n const factory = readJsonSafe(join(bmDir, \"factory.json\"));\n\n const projectsDir = join(bmDir, \"projects\");\n let projects: string[] = [];\n if (existsSync(projectsDir)) {\n projects = readdirSync(projectsDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(\".json\", \"\"));\n }\n\n const runsDir = join(factoryPath, \"runs\");\n let runs: string[] = [];\n if (existsSync(runsDir)) {\n runs = readdirSync(runsDir).filter((d) => {\n try { return statSync(join(runsDir, d)).isDirectory(); } catch { return false; }\n }).sort().reverse().slice(0, 10);\n }\n\n // Daemon detection: PID file + pgrep fallback\n let daemonStatus = \"stopped\";\n let daemonPid: number | null = null;\n const pidFile = join(bmDir, \"daemon.pid\");\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n daemonStatus = \"running\";\n } catch {\n daemonPid = null;\n }\n }\n if (!daemonPid) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\", timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n daemonStatus = \"running\";\n }\n }\n } catch { /* ignore */ }\n }\n\n // Board item counts\n let boardSummary = \"board unreachable\";\n try {\n const boardUrl = getBoardUrl(factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n const poll = JSON.parse(pollData);\n const counts: Record<string, number> = {};\n let total = 0;\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items) && items.length > 0) {\n counts[status] = items.length;\n total += items.length;\n }\n }\n boardSummary = `${total} items: ${JSON.stringify(counts)}`;\n } catch { /* ignore */ }\n\n return JSON.stringify({\n factory,\n projects,\n recent_runs: runs,\n daemon: { status: daemonStatus, pid: daemonPid },\n board: boardSummary,\n }, null, 2);\n }\n\n case \"factory_config\": {\n const configPath = join(factoryPath, \".beastmode\", \"config.json\");\n const config = readJsonSafe(configPath);\n return config ? JSON.stringify(config, null, 2) : \"No config.json found.\";\n }\n\n case \"board_items\": {\n const boardUrl = getBoardUrl(factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n try {\n const poll = JSON.parse(pollData);\n // Flatten into a readable list\n const allItems: Array<{ id: string; name: string; status: string; priority: string; type: string; updated: string }> = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items)) {\n for (const item of items) {\n const i = item as Record<string, unknown>;\n allItems.push({\n id: String(i.id || \"\"),\n name: String(i.name || \"\"),\n status: String(i.status || status),\n priority: String(i.priority || \"\"),\n type: String(i.task_type || \"\"),\n updated: String(i.updated_at || \"\"),\n });\n }\n }\n }\n if (allItems.length === 0) return \"Board is empty — no tasks.\";\n // Limit to 30 items for token efficiency\n const limited = allItems.slice(0, 30);\n const summary = limited.length < allItems.length\n ? `\\n\\n(Showing ${limited.length} of ${allItems.length} items)`\n : \"\";\n return JSON.stringify(limited, null, 2) + summary;\n } catch {\n return `Board response: ${pollData.slice(0, 500)}`;\n }\n }\n\n case \"board_item_updates\": {\n const itemId = toolInput.item_id as string;\n const boardUrl = getBoardUrl(factoryPath);\n const data = await boardGet(`/api/items/${itemId}/updates`, boardUrl);\n try {\n const updates = JSON.parse(data);\n const list = Array.isArray(updates) ? updates : [];\n if (list.length === 0) return \"No updates on this item.\";\n // Limit and summarize\n const limited = list.slice(0, 10).map((u: Record<string, unknown>) => ({\n id: u.id,\n author: u.creator_name,\n body: String(u.body || \"\").slice(0, 500),\n created: u.created_at,\n }));\n return JSON.stringify(limited, null, 2);\n } catch {\n return `Updates response: ${data.slice(0, 500)}`;\n }\n }\n\n case \"list_runs\": {\n const runsDir = join(factoryPath, \"runs\");\n if (!existsSync(runsDir)) return \"No runs directory.\";\n const runDirs = readdirSync(runsDir).sort().reverse();\n const results: Array<{ id: string; stage: string; satisfaction: number | null; iterations: number }> = [];\n for (const id of runDirs.slice(0, 15)) {\n const cp = readJsonSafe(join(runsDir, id, \"checkpoint.json\")) as Record<string, unknown> | null;\n if (cp) {\n const hist = Array.isArray(cp.satisfaction_history) ? cp.satisfaction_history : [];\n results.push({\n id,\n stage: String(cp.current_stage || \"unknown\"),\n satisfaction: hist.length > 0 ? hist[hist.length - 1] as number : null,\n iterations: (cp.iteration_count as number) || 0,\n });\n }\n }\n return results.length > 0 ? JSON.stringify(results, null, 2) : \"No runs with checkpoints.\";\n }\n\n case \"run_detail\": {\n const runId = toolInput.run_id as string;\n if (runId.includes(\"..\")) return \"Invalid run_id.\";\n const runDir = join(factoryPath, \"runs\", runId);\n if (!existsSync(runDir)) return `Run not found: ${runId}`;\n const manifest = readJsonSafe(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonSafe(join(runDir, \"checkpoint.json\"));\n const iterDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterDir)) {\n for (const d of readdirSync(iterDir).sort()) {\n const sat = readJsonSafe(join(iterDir, d, \"satisfaction.json\"));\n iterations.push({ number: parseInt(d, 10), satisfaction: sat });\n }\n }\n const files = readdirSync(runDir);\n return JSON.stringify({ id: runId, files, manifest, checkpoint, iterations }, null, 2);\n }\n\n case \"read_run_file\": {\n const runId = toolInput.run_id as string;\n const relPath = toolInput.file_path as string;\n if (runId.includes(\"..\") || relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, \"runs\", runId, relPath);\n if (!existsSync(fullPath)) return `File not found: runs/${runId}/${relPath}`;\n const content = readFileSync(fullPath, \"utf-8\");\n return content.length > 10000 ? content.slice(0, 10000) + \"\\n\\n... (truncated at 10KB)\" : content;\n }\n\n case \"list_projects\": {\n const projDir = join(factoryPath, \".beastmode\", \"projects\");\n if (!existsSync(projDir)) return \"No projects registered.\";\n const projects = readdirSync(projDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try { return JSON.parse(readFileSync(join(projDir, f), \"utf-8\")); } catch { return null; }\n })\n .filter(Boolean);\n return projects.length > 0 ? JSON.stringify(projects, null, 2) : \"No projects registered.\";\n }\n\n case \"read_file\": {\n const relPath = toolInput.path as string;\n if (relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, relPath);\n if (!fullPath.startsWith(factoryPath)) return \"Path traversal not allowed.\";\n if (!existsSync(fullPath)) return `File not found: ${relPath}`;\n try {\n const entries = readdirSync(fullPath);\n return `\"${relPath}\" is a directory with ${entries.length} entries: ${entries.slice(0, 30).join(\", \")}`;\n } catch { /* not a directory */ }\n const content = readFileSync(fullPath, \"utf-8\");\n return content.length > 10000 ? content.slice(0, 10000) + \"\\n\\n... (truncated at 10KB)\" : content;\n }\n\n case \"list_directory\": {\n const relPath = (toolInput.path as string) || \"\";\n if (relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, relPath);\n if (!fullPath.startsWith(factoryPath)) return \"Path traversal not allowed.\";\n if (!existsSync(fullPath)) return `Directory not found: ${relPath || \"/\"}`;\n try {\n return readdirSync(fullPath).join(\"\\n\");\n } catch {\n return `Not a directory: ${relPath}`;\n }\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n } catch (err) {\n return `Tool error: ${(err as Error).message}`;\n }\n}\n\n// ── Chat history persistence ──\n\nfunction getChatHistoryDir(factoryPath: string): string {\n const dir = join(factoryPath, \".beastmode\", \"chat-history\");\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction saveConversation(\n factoryPath: string,\n sessionId: string,\n messages: ConversationMessage[],\n scope: string,\n): void {\n const dir = getChatHistoryDir(factoryPath);\n const data = {\n id: sessionId,\n scope,\n updated_at: new Date().toISOString(),\n messages,\n };\n writeFileSync(join(dir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n}\n\nexport function listConversations(\n factoryPath: string,\n): Array<{ id: string; scope: string; updated_at: string; message_count: number; preview: string }> {\n const dir = getChatHistoryDir(factoryPath);\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n const data = JSON.parse(readFileSync(join(dir, f), \"utf-8\"));\n const msgs = data.messages || [];\n const firstUser = msgs.find((m: ConversationMessage) => m.role === \"user\");\n const preview = typeof firstUser?.content === \"string\"\n ? firstUser.content.slice(0, 80)\n : \"\";\n return {\n id: data.id,\n scope: data.scope || \"factory\",\n updated_at: data.updated_at || \"\",\n message_count: msgs.length,\n preview,\n };\n } catch {\n return null;\n }\n })\n .filter((x): x is { id: string; scope: string; updated_at: string; message_count: number; preview: string } => x !== null)\n .sort((a, b) => b.updated_at.localeCompare(a.updated_at))\n .slice(0, 50);\n}\n\nexport function loadConversation(factoryPath: string, sessionId: string): ConversationMessage[] {\n if (sessionId.includes(\"..\")) return [];\n const file = join(getChatHistoryDir(factoryPath), `${sessionId}.json`);\n if (!existsSync(file)) return [];\n try {\n const data = JSON.parse(readFileSync(file, \"utf-8\"));\n return data.messages || [];\n } catch {\n return [];\n }\n}\n\n// ── System prompt ──\n\nfunction buildSystemPrompt(factoryPath: string): string {\n let factoryName = \"BeastMode Factory\";\n const factoryJson = readJsonSafe(join(factoryPath, \".beastmode\", \"factory.json\")) as {\n factory_name?: string; name?: string;\n } | null;\n if (factoryJson?.factory_name) factoryName = factoryJson.factory_name;\n else if (factoryJson?.name) factoryName = factoryJson.name;\n\n return `You are BeastMode Assistant — a concise, helpful assistant for the \"${factoryName}\" factory at ${factoryPath}.\n\n## CRITICAL RULES\n- You have tools that execute AUTOMATICALLY on the server. You NEVER need user permission. NEVER ask for permission.\n- NEVER use curl, wget, or any external HTTP calls. Your tools handle all data access.\n- NEVER reference Monday.com. This factory uses its own BeastMode Board (a local self-hosted task board).\n- All task/item data comes from the board_items tool. Use it for any question about tasks, status, or work.\n- Tool results are returned to you instantly. Just call the tool and use the result.\n- NEVER invent a name for yourself like \"BeastBot\" or any variation. You are \"BeastMode\". Address the user as a human, not a bot.\n\n## What You Can Do\n- Check task status, board items, and pipeline runs using your built-in tools\n- Read factory config, run artifacts (nlspec, plan, scenarios, satisfaction results)\n- Explore the codebase and project files\n- Explain BeastMode concepts (pipeline stages, convergence loop, satisfaction scores)\n\n## BeastMode Overview\nBeastMode is a Dark Factory pipeline that turns natural language intent into verified software.\nPipeline: Spec → Plan → Scenarios → Build-Verify Loop (convergence) → Ship → Production Verification.\nQuality is measured by satisfaction score (0.0-1.0, threshold typically 0.85).\nThe daemon polls the board for tasks and runs the pipeline automatically.\n\n## Style\n- Be concise and direct — short answers unless detail is asked for\n- Format data clearly with markdown\n- Proactively flag issues (stuck tasks, failed runs, stale state)`;\n}\n\n// ── Quick Brainstorm prompt ──\n\nfunction buildQuickBrainstormPrompt(factoryPath: string, projectName: string, index: Record<string, unknown>): string {\n const stats = index.stats as Record<string, unknown> | undefined;\n const artifacts = (index.artifacts as Array<{ type: string; summary: string; date: string }>) || [];\n return `You are BeastMode Strategy Assistant for project \"${projectName}\".\n\nYou have deep context about this project. Use it to give informed answers.\n\n## Project Context\n${JSON.stringify(stats, null, 2)}\n\n## Available Artifacts (use load_artifact tool to read details)\n${artifacts.map((a) => `- [${a.type}] ${a.summary} (${a.date})`).join(\"\\n\")}\n\n## Your Role\n- Answer questions about the project architecture, patterns, and history\n- Brainstorm features and approaches with codebase awareness\n- When the user wants to act on an idea, offer to create an epic/task on the board\n- Be concise and direct. Use your project knowledge.\n\n## Tools\nYou have load_artifact, read_file, list_directory, board_items tools available.\nUse them to give informed, specific answers.`;\n}\n\n// ── Session type system prompts ──\n\nconst SESSION_TYPE_PROMPTS: Record<string, string> = {\n feature: \"You are brainstorming a new feature. Explore requirements, UX, trade-offs. When the idea solidifies, offer to create board tasks as Drafts using the board API.\",\n architecture: \"You are evaluating a technical design decision. Consider trade-offs, alternatives, scalability. Offer to log decisions using the Decision API when conclusions are reached.\",\n refactor: \"You are planning a refactoring effort. Assess scope, risk, dependencies. Offer to break the plan into board tasks using the board API.\",\n product: \"\",\n review: \"You are reviewing recent work. Analyze runs, satisfaction scores, learnings. Surface patterns and suggest improvements. Reference specific run data from the board context.\",\n \"free-form\": \"\",\n};\n\n// ── Chat Manager ──\n\nexport function createChatManager(): ChatManager {\n const sessions = new Map<string, ChatSession>();\n const wss = new WebSocketServer({ noServer: true });\n\n function startSession(factoryPath: string): ChatSession {\n // Only one session at a time\n for (const [id] of sessions) {\n stopSession(id);\n }\n\n const session: ChatSession = {\n id: randomUUID(),\n process: null,\n socket: null,\n createdAt: Date.now(),\n factoryPath,\n claudeSessionId: null,\n busy: false,\n messageQueue: [],\n conversationHistory: [],\n backend: null,\n sessionType: \"chat\",\n };\n\n sessions.set(session.id, session);\n return session;\n }\n\n function stopSession(sessionId: string): void {\n const session = sessions.get(sessionId);\n if (!session) return;\n if (session.process) {\n try { session.process.kill(\"SIGTERM\"); } catch { /* */ }\n session.process = null;\n }\n if (session.socket) {\n try { session.socket.close(); } catch { /* */ }\n session.socket = null;\n }\n sessions.delete(sessionId);\n }\n\n function handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void {\n let session: ChatSession | null = null;\n for (const s of sessions.values()) { session = s; }\n\n if (!session) {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.end();\n return;\n }\n\n wss.handleUpgrade(req, socket, head, (ws) => {\n session!.socket = ws;\n\n ws.on(\"message\", (data: Buffer) => {\n try {\n const msg = JSON.parse(data.toString());\n if (msg.type === \"message\" && msg.content) {\n handleUserMessage(session!, msg.content, msg.scope || \"factory\");\n }\n } catch { /* ignore */ }\n });\n\n ws.on(\"close\", () => {\n // Don't destroy session on disconnect — preserve conversation history\n if (session) session.socket = null;\n });\n\n ws.on(\"error\", () => {\n if (session) session.socket = null;\n });\n });\n }\n\n function handleUserMessage(session: ChatSession, content: string, scope: string): void {\n if (session.busy) {\n session.messageQueue.push(JSON.stringify({ content, scope }));\n sendToClient(session, { type: \"system\", message: \"Message queued — processing previous request.\" });\n return;\n }\n\n if (session.sessionType === \"inception\") {\n handleInceptionMessage(session, content);\n } else {\n runMessage(session, content, scope);\n }\n }\n\n async function handleInceptionMessage(\n session: ChatSession,\n content: string,\n ): Promise<void> {\n if (!session.inception) return;\n const { productName, factoryDir } = session.inception;\n const state = loadInception(factoryDir, productName);\n if (!state) {\n sendToClient(session, { type: \"error\", message: \"Inception state not found\" });\n return;\n }\n\n // Check for approval command\n if (content.trim().toLowerCase() === \"approve\" || content.trim().toLowerCase() === \"approved\") {\n const updated = advancePhase(factoryDir, productName);\n if (updated.status === \"completed\") {\n sendToClient(session, { type: \"system\", message: \"All phases complete! Creating epic tasks on the board...\" });\n // TODO: Task 5 handles epic creation\n return;\n }\n const methodology = getMethodology(state.methodology);\n const nextPhase = methodology.phases[updated.currentPhase];\n sendToClient(session, {\n type: \"system\",\n message: `Phase \"${state.phases[state.currentPhase].name}\" approved. Moving to: ${nextPhase.name} (${nextPhase.agent_role})`,\n });\n // Clear conversation for fresh phase context\n session.conversationHistory = [];\n return;\n }\n\n // Load existing artifacts for context\n const artifacts: Record<string, string> = {};\n for (const phase of state.phases) {\n if (phase.status === \"approved\") {\n const artifactContent = loadArtifact(factoryDir, productName, phase.artifact);\n if (artifactContent) artifacts[phase.artifact] = artifactContent;\n }\n }\n\n // Build phase-specific system prompt\n const phasePrompt = buildPhasePrompt(state, artifacts);\n const methodology = getMethodology(state.methodology);\n const currentPhase = methodology.phases[state.currentPhase];\n\n const systemPrompt = `You are BeastMode's ${currentPhase.agent_role} agent, conducting Phase ${state.currentPhase + 1}: ${currentPhase.name}.\n\n${phasePrompt}\n\nIMPORTANT RULES:\n- Stay in character as a ${currentPhase.agent_role}\n- Focus on this phase only — don't jump ahead\n- When you produce the final artifact, format it as a complete markdown document\n- Start the artifact with \"# ${currentPhase.name}\" as the heading\n- The user can type \"approve\" to approve your artifact and move to the next phase`;\n\n // Route to API backend with inception system prompt\n await runViaApi(session, content, \"factory\", systemPrompt);\n }\n\n async function runMessage(session: ChatSession, content: string, scope: string = \"factory\"): Promise<void> {\n if (!session.backend) {\n if (process.env.ANTHROPIC_API_KEY) {\n session.backend = \"api\";\n } else {\n try {\n execSync(\"which claude\", { timeout: 3000, encoding: \"utf-8\" });\n session.backend = \"cli\";\n } catch {\n sendToClient(session, {\n type: \"error\",\n message: \"No Claude Code CLI found and no ANTHROPIC_API_KEY set. Run `claude login` (recommended) or set ANTHROPIC_API_KEY.\",\n });\n return;\n }\n }\n }\n\n if (session.backend === \"api\") {\n await runViaApi(session, content, scope);\n } else {\n await runViaCli(session, content, scope);\n }\n }\n\n // ═══════════════════════════════════════════════════\n // Backend 1: Anthropic API with streaming + tools\n // ═══════════════════════════════════════════════════\n\n async function runViaApi(session: ChatSession, content: string, scope: string = \"factory\", systemPromptOverride?: string): Promise<void> {\n session.busy = true;\n\n try {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n const client = new Anthropic();\n\n session.conversationHistory.push({ role: \"user\", content });\n\n let scopePrefix = \"\";\n if (scope && scope !== \"factory\") {\n scopePrefix = `\\n\\nYou are currently scoped to project \"${scope}\". Focus your answers on this project. When using tools, prioritize data relevant to this project.\\n`;\n }\n\n // Quick Brainstorm mode: build project-context system prompt\n if (!systemPromptOverride && session.inception?.mode === \"quick_brainstorm\" && session.inception.productName) {\n try {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n const index = buildArtifactIndex(session.factoryPath, session.inception.productName) as unknown as Record<string, unknown>;\n systemPromptOverride = buildQuickBrainstormPrompt(session.factoryPath, session.inception.productName, index);\n } catch {\n // Fall through to default system prompt if strategy module unavailable\n }\n }\n\n const systemPrompt = systemPromptOverride || (buildSystemPrompt(session.factoryPath) + scopePrefix);\n const tools = getToolDefinitions();\n\n // Agentic loop: Claude may call tools, get results, respond, call more tools\n let continueLoop = true;\n let loopCount = 0;\n const maxLoops = 10; // prevent infinite loops\n\n while (continueLoop && loopCount < maxLoops) {\n continueLoop = false;\n loopCount++;\n\n const stream = client.messages.stream({\n model: \"claude-sonnet-4-20250514\",\n max_tokens: 4096,\n system: systemPrompt,\n tools: tools as Parameters<typeof client.messages.stream>[0][\"tools\"],\n messages: session.conversationHistory as Parameters<typeof client.messages.stream>[0][\"messages\"],\n });\n\n const contentBlocks: Array<{ type: string; [key: string]: unknown }> = [];\n let hasToolUse = false;\n\n // Stream text to frontend in real-time\n stream.on(\"text\", (text: string) => {\n sendToClient(session, {\n type: \"content_block_delta\",\n delta: { type: \"text_delta\", text },\n });\n });\n\n const message = await stream.finalMessage();\n\n // Process content blocks\n const toolResultsMap = new Map<string, string>();\n\n for (const block of message.content) {\n if (block.type === \"text\") {\n contentBlocks.push({ type: \"text\", text: block.text });\n } else if (block.type === \"tool_use\") {\n hasToolUse = true;\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n });\n\n // Show tool call to frontend\n sendToClient(session, {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n });\n\n // Execute tool automatically (async for board HTTP calls)\n const result = await executeTool(\n block.name,\n block.input as Record<string, unknown>,\n session.factoryPath,\n );\n toolResultsMap.set(block.id, result);\n\n // Show truncated result to frontend\n sendToClient(session, {\n type: \"tool_result\",\n id: block.id,\n name: block.name,\n output: result.length > 500 ? result.slice(0, 500) + \"...\" : result,\n });\n }\n }\n\n // Add assistant response to history\n session.conversationHistory.push({\n role: \"assistant\",\n content: contentBlocks,\n });\n\n // If tools were called, feed results back and continue\n if (hasToolUse) {\n const toolResults: Array<{\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n }> = [];\n\n for (const block of message.content) {\n if (block.type === \"tool_use\") {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: block.id,\n content: toolResultsMap.get(block.id) || \"\",\n });\n }\n }\n\n session.conversationHistory.push({\n role: \"user\",\n content: toolResults,\n });\n\n continueLoop = true;\n }\n\n if (message.stop_reason === \"end_turn\") {\n continueLoop = false;\n }\n }\n\n // Signal completion (silent — frontend just stops thinking indicator)\n sendToClient(session, { type: \"result\", subtype: \"success\" });\n } catch (err) {\n const errMsg = (err as Error).message || \"Unknown error\";\n sendToClient(session, {\n type: \"error\",\n message: `API error: ${errMsg}`,\n });\n } finally {\n // Persist conversation to disk\n try { saveConversation(session.factoryPath, session.id, session.conversationHistory, scope); } catch { /* ignore */ }\n\n session.busy = false;\n const next = session.messageQueue.shift();\n if (next) {\n try {\n const parsed = JSON.parse(next);\n runMessage(session, parsed.content, parsed.scope || \"factory\");\n } catch {\n runMessage(session, next, \"factory\");\n }\n }\n }\n }\n\n // ═══════════════════════════════════════════════════\n // Backend 2: Claude Code CLI (fallback)\n // ═══════════════════════════════════════════════════\n\n async function runViaCli(session: ChatSession, content: string, scope: string = \"factory\"): Promise<void> {\n session.busy = true;\n\n try {\n const { spawn } = await import(\"child_process\");\n\n // Pre-fetch board data so Claude doesn't need to use curl\n let boardContext = \"\";\n try {\n const boardUrl = getBoardUrl(session.factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n const poll = JSON.parse(pollData);\n const summary: string[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items) && items.length > 0) {\n for (const item of items) {\n const i = item as Record<string, unknown>;\n summary.push(`#${i.id} \"${i.name}\" [${i.status}] priority=${i.priority || \"none\"} type=${i.task_type || \"auto\"}`);\n }\n }\n }\n if (summary.length > 0) {\n boardContext = `\\n\\nCurrent board items (${summary.length} total):\\n${summary.join(\"\\n\")}`;\n } else {\n boardContext = \"\\n\\nBoard is empty — no tasks.\";\n }\n } catch {\n boardContext = \"\\n\\nBoard unavailable.\";\n }\n\n const scopeContext = scope !== \"factory\"\n ? `\\nYou are scoped to project \"${scope}\". Focus answers on this project only.`\n : \"\\nYou have factory-wide scope. Answer questions about any/all projects.\";\n\n // Build the prompt with full context + conversation history.\n // We always include the system preamble and history rather than\n // relying on --resume, which breaks in Docker (session storage\n // not persisting between CLI invocations).\n let historyBlock = \"\";\n if (session.conversationHistory.length > 0) {\n // Include last N turns to stay within context limits\n const recentHistory = session.conversationHistory.slice(-20);\n const formatted = recentHistory.map(h =>\n h.role === \"user\" ? `User: ${h.content}` : `Assistant: ${h.content}`\n ).join(\"\\n\\n\");\n historyBlock = `\\n\\nCONVERSATION HISTORY (continue this conversation naturally):\\n${formatted}\\n\\n---\\n`;\n }\n\n // Resolve board URL for API instructions\n const boardApiUrl = getBoardUrl(session.factoryPath);\n const boardParam = scope !== \"factory\" ? `?board=${scope}` : \"\";\n\n const prompt = `CRITICAL CONTEXT — YOU MUST READ THIS:\nYou are the BeastMode chat assistant running inside a BeastMode factory.\n\nIMPORTANT RULES:\n- Monday.com does NOT exist in this system. NEVER mention Monday.com. There is NO Monday.com integration.\n- This factory uses a LOCAL self-hosted BeastMode Board with a REST API.\n- You have tools available. You can execute bash commands. Use curl to interact with the board API.\n- NEVER ask for permissions. You have full access. Just do it.\n${scopeContext}\n${session.sessionTypePrompt ? \"\\nSESSION ROLE:\\n\" + session.sessionTypePrompt + \"\\n\" : \"\"}\nBOARD API (use curl to manage tasks):\n- Base URL: ${boardApiUrl}\n- List items: curl -s '${boardApiUrl}/api/items${boardParam}'\n- Create item: curl -s -X POST '${boardApiUrl}/api/items${boardParam}' -H 'Content-Type: application/json' -d '{\"name\":\"Task title\",\"status\":\"\",\"priority\":\"Medium\",\"task_type\":\"deep-planning\"}'\n (status=\"\" means Draft/New. Valid statuses: \"\", \"New\", \"Ready\", \"Working on it\", \"Done\", etc.)\n- Update item: curl -s -X PATCH '${boardApiUrl}/api/items/ITEM_ID${boardParam}' -H 'Content-Type: application/json' -d '{\"status\":\"Ready\"}'\n\nDECISION API (use curl to log strategic decisions):\n- List: curl -s '${boardApiUrl}/api/strategy/${scope}/decisions'\n- Create: curl -s -X POST '${boardApiUrl}/api/strategy/${scope}/decisions' -H 'Content-Type: application/json' -d '{\"title\":\"Decision title\",\"context\":\"Why this was decided\"}'\n- Update: curl -s -X PATCH '${boardApiUrl}/api/strategy/${scope}/decisions/ID' -H 'Content-Type: application/json' -d '{\"status\":\"superseded\",\"outcome\":\"What happened\"}'\n\nCurrent board items:\n${boardContext}\n\nFactory path: ${session.factoryPath}\n${historyBlock}\nUSER MESSAGE: ${content}\n\nRespond concisely. Continue the conversation naturally.`;\n\n // Use --allowedTools to whitelist safe tools for board interaction.\n // In Docker (root), wrap with runuser to avoid the root-user block\n // on --dangerously-skip-permissions.\n const isRoot = process.getuid?.() === 0;\n const claudeArgs: string[] = [\n \"-p\", prompt,\n \"--output-format\", \"stream-json\",\n \"--verbose\",\n \"--dangerously-skip-permissions\",\n ];\n\n // When running as root (Docker), use runuser to drop to 'node' user\n // so Claude Code CLI allows --dangerously-skip-permissions and has\n // a proper writable home directory for session storage.\n let spawnCmd: string;\n let spawnArgs: string[];\n if (isRoot) {\n spawnCmd = \"runuser\";\n spawnArgs = [\"-u\", \"node\", \"--\", \"claude\", ...claudeArgs];\n } else {\n spawnCmd = \"claude\";\n spawnArgs = claudeArgs;\n }\n\n const child = spawn(spawnCmd, spawnArgs, {\n cwd: session.factoryPath,\n env: {\n ...process.env,\n BEASTMODE_FACTORY_PATH: session.factoryPath,\n ...(isRoot ? { HOME: \"/home/node\" } : {}),\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n session.process = child;\n\n // Track conversation for persistence\n session.conversationHistory.push({ role: \"user\", content });\n let collectedText = \"\";\n\n let stdoutBuffer = \"\";\n child.stdout?.on(\"data\", (data: Buffer) => {\n stdoutBuffer += data.toString(\"utf-8\");\n const lines = stdoutBuffer.split(\"\\n\");\n stdoutBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line);\n if (parsed.type === \"system\" && parsed.subtype === \"init\" && parsed.session_id) {\n session.claudeSessionId = parsed.session_id;\n continue;\n }\n if (parsed.type === \"rate_limit_event\") continue;\n\n // Collect assistant text for history\n if (parsed.type === \"assistant\" && parsed.message?.content) {\n for (const block of parsed.message.content as Array<{ type: string; text?: string }>) {\n if (block.type === \"text\" && block.text) collectedText += block.text;\n }\n } else if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n collectedText += parsed.delta.text as string;\n }\n\n const transformed = transformCliEvent(parsed);\n if (transformed) sendToClient(session, transformed);\n } catch {\n // Non-JSON lines from Claude CLI (progress, box-drawing,\n // debug output). Never forward these — they render as\n // mysterious gray shapes in the chat UI.\n }\n }\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const text = data.toString(\"utf-8\").trim();\n if (!text) return;\n // Filter non-fatal Claude CLI startup noise (config migrations,\n // backup messages, version checks). These are cosmetic — Claude\n // still works. Only surface genuine errors to the user.\n if (\n text.includes(\"configuration file not found\") ||\n text.includes(\"backup file exists\") ||\n text.includes(\"manually restore it by running\") ||\n text.includes(\"CLAUDE_CODE_\")\n ) return;\n sendToClient(session, { type: \"error\", message: text });\n });\n\n child.on(\"exit\", () => {\n session.process = null;\n session.busy = false;\n\n // Save assistant response and persist conversation\n if (collectedText) {\n session.conversationHistory.push({ role: \"assistant\", content: collectedText });\n }\n try { saveConversation(session.factoryPath, session.id, session.conversationHistory, scope); } catch { /* ignore */ }\n\n sendToClient(session, { type: \"result\", subtype: \"success\" });\n const next = session.messageQueue.shift();\n if (next) {\n try {\n const parsed = JSON.parse(next);\n runMessage(session, parsed.content, parsed.scope || \"factory\");\n } catch {\n runMessage(session, next, \"factory\");\n }\n }\n });\n\n child.on(\"error\", (err) => {\n sendToClient(session, { type: \"error\", message: `Process error: ${err.message}` });\n session.process = null;\n session.busy = false;\n });\n } catch (err) {\n sendToClient(session, {\n type: \"error\",\n message: `Failed to spawn Claude: ${(err as Error).message}`,\n });\n session.busy = false;\n }\n }\n\n function transformCliEvent(parsed: Record<string, unknown>): Record<string, unknown> | null {\n const type = parsed.type as string;\n switch (type) {\n case \"assistant\": {\n const msg = parsed.message as { content?: unknown[] } | undefined;\n if (msg?.content) return { type: \"assistant\", content: msg.content };\n if (parsed.content) return { type: \"assistant\", content: parsed.content };\n return null;\n }\n case \"content_block_delta\":\n case \"content_block_start\":\n case \"content_block_stop\":\n case \"message_start\":\n case \"message_delta\":\n case \"result\":\n return parsed;\n default:\n return parsed;\n }\n }\n\n function sendToClient(session: ChatSession, data: Record<string, unknown>): void {\n if (session.socket && session.socket.readyState === WsWebSocket.OPEN) {\n session.socket.send(JSON.stringify(data));\n }\n }\n\n function shutdown(): void {\n for (const [id] of sessions) { stopSession(id); }\n wss.close();\n }\n\n return { sessions, startSession, stopSession, handleUpgrade, shutdown };\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync, mkdirSync, statSync, rmSync } from \"fs\";\nimport { join, basename, resolve, dirname } from \"path\";\nimport { homedir } from \"os\";\nimport { archiveOldRuns, pinRun, unpinRun, isRunPinned } from \"./archival.js\";\nimport { randomUUID } from \"crypto\";\nimport { execSync, spawnSync } from \"child_process\";\nimport http from \"http\";\nimport { listConversations, loadConversation } from \"./chat-handler.js\";\nimport {\n collectStatus,\n installPlugin,\n removePlugin,\n fetchRegistryIndex,\n addMcp,\n removeMcp,\n listMcps,\n listSkills,\n createSkill,\n removeSkill,\n addHook,\n removeHook,\n listHooks,\n configReset,\n generateDefaults,\n detectStack,\n} from \"../../engine/index.js\";\nimport type { StatusInput, HookEvent } from \"../../engine/index.js\";\n\nexport interface BoardRoute {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n pattern: string;\n handler: (\n body: unknown,\n params: Record<string, string>,\n query?: Record<string, string>,\n ) => Promise<unknown> | unknown;\n}\n\n/**\n * Sentinel response type used by handlers that need to return raw\n * binary bytes (e.g., attachment downloads) instead of JSON. The\n * request dispatcher in `server.ts` checks `instanceof BinaryResponse`\n * and writes the bytes directly with the correct Content-Type and\n * Content-Length headers.\n *\n * Added 2026-04-15 for Gap 8a (attachments display). The existing\n * proxyToBoard helper is JSON-only because it does `JSON.parse(data)`\n * on every response, which corrupts image bytes. Binary routes use\n * `proxyBinaryToBoard` (below) to fetch the raw body and wrap it in\n * this class.\n */\nexport class BinaryResponse {\n constructor(\n public body: Buffer,\n public contentType: string,\n public filename?: string,\n ) {}\n}\n\n/** Validate that a name parameter is a simple identifier (no path traversal). */\nfunction assertSafeName(name: string): void {\n if (!name || /[/\\\\]/.test(name) || name === \".\" || name === \"..\") {\n throw new Error(`Invalid name: ${name}`);\n }\n}\n\n// ── Board proxy to existing board API ──\n\n/**\n * Thrown by proxyToBoard when the upstream board returns a 4xx or 5xx.\n * server.ts catches this and relays the status code verbatim so clients\n * (browser and verifier curl calls) see the board's real HTTP status\n * instead of a mis-classified 200 or 500.\n */\nexport class HttpError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly body: unknown,\n ) {\n super(`Board returned HTTP ${statusCode}`);\n this.name = \"HttpError\";\n }\n}\n\nexport function getBoardUrl(factoryDir: string): string {\n // Env var overrides all (used in Docker to point at internal board service)\n if (process.env.BEASTMODE_BOARD_URL) return process.env.BEASTMODE_BOARD_URL;\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.task_backend?.config?.url) {\n return config.task_backend.config.url;\n }\n } catch { /* ignore */ }\n }\n return \"http://127.0.0.1:8080\";\n}\n\nfunction proxyToBoard(\n boardUrl: string,\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string>,\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const postData = body ? JSON.stringify(body) : undefined;\n const req = http.request(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(postData ? { \"Content-Length\": Buffer.byteLength(postData).toString() } : {}),\n },\n }, (res) => {\n const statusCode = res.statusCode ?? 200;\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => {\n let parsed: unknown;\n try { parsed = JSON.parse(data); } catch { parsed = { raw: data }; }\n if (statusCode >= 400) {\n reject(new HttpError(statusCode, parsed));\n } else {\n resolve(parsed);\n }\n });\n });\n req.on(\"error\", (err) => reject(new Error(`Board proxy error: ${err.message}`)));\n if (postData) req.write(postData);\n req.end();\n });\n}\n\n/**\n * Binary-safe counterpart to proxyToBoard. Collects the response body\n * as Buffer chunks (not decoded to string) and returns a BinaryResponse\n * with the original Content-Type header preserved. Used for attachment\n * downloads (Gap 8a). Added 2026-04-15.\n */\nfunction proxyBinaryToBoard(\n boardUrl: string,\n path: string,\n query?: Record<string, string>,\n): Promise<BinaryResponse> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const req = http.request(\n url,\n { method: \"GET\" },\n (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(\n new Error(\n `Board proxy error: HTTP ${res.statusCode} for ${path}`,\n ),\n );\n return;\n }\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const body = Buffer.concat(chunks);\n const contentType = res.headers[\"content-type\"] || \"application/octet-stream\";\n // Content-Disposition gives us the original filename when\n // the backend sends FileResponse(..., filename=...)\n const cd = res.headers[\"content-disposition\"] || \"\";\n const match = /filename=\"([^\"]+)\"/.exec(cd);\n const filename = match ? match[1] : undefined;\n resolve(new BinaryResponse(body, contentType, filename));\n });\n },\n );\n req.on(\"error\", (err) =>\n reject(new Error(`Board proxy error: ${err.message}`)),\n );\n req.end();\n });\n}\n\n/**\n * Gap 8 transparent fallback proxy. Used by `server.ts` when a `/api/*`\n * request didn't match any explicit `boardRoutes` pattern or any local\n * handler (init/chat). Forwards the request unchanged to the board and\n * returns its raw response (status code + content-type + body bytes) so\n * the UI dispatcher can relay it verbatim to the client.\n *\n * This makes new board routes reachable from the UI automatically\n * instead of requiring a manual allowlist entry in `getBoardRoutes()`\n * — the \"invisible contract\" failure mode that broke Story 1's\n * `/api/pipeline-config` endpoint. Added 2026-04-16.\n */\nexport function transparentProxyToBoard(\n boardUrl: string,\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown,\n query?: Record<string, string>,\n): Promise<{ statusCode: number; contentType: string; body: Buffer }> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const postData = body !== undefined ? JSON.stringify(body) : undefined;\n const req = http.request(\n url,\n {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(postData\n ? { \"Content-Length\": Buffer.byteLength(postData).toString() }\n : {}),\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n resolve({\n statusCode: res.statusCode || 502,\n contentType:\n (res.headers[\"content-type\"] as string) || \"application/json\",\n body: Buffer.concat(chunks),\n });\n });\n },\n );\n req.on(\"error\", (err) =>\n reject(new Error(`Board proxy error: ${err.message}`)),\n );\n if (postData) req.write(postData);\n req.end();\n });\n}\n\n// Build the query dict we forward to the board server. We only care\n// about `board` here — passing anything else risks leaking the UI's\n// internal query params into the backend.\nfunction scopedQuery(query?: Record<string, string>): Record<string, string> | undefined {\n if (!query) return undefined;\n const b = query.board;\n if (!b || b === \"all\") return undefined;\n return { board: b };\n}\n\n// ── Helpers (file I/O) ──\n\nfunction readJsonFile(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] !== null &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key]) &&\n target[key] !== null &&\n typeof target[key] === \"object\" &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, unknown>,\n source[key] as Record<string, unknown>\n );\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\nfunction getRunsDir(factoryDir: string): string {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.runs_path) return config.runs_path;\n } catch { /* ignore */ }\n }\n return join(factoryDir, \"runs\");\n}\n\n// ── Threshold safety check (feature #7) ────────────────────────────\n\nexport interface StrandedRun {\n run_id: string;\n item_id: string | null;\n best_satisfaction: number;\n project_id: string | null;\n current_stage: string;\n}\n\nconst _TERMINAL_STAGES = new Set<string>([\n \"done\",\n \"shipped\",\n \"stuck\",\n \"stuck_oscillating\",\n \"stuck_infra_gap\",\n \"ready_for_review\",\n]);\n\n/**\n * Scan runs_dir for active runs whose best_satisfaction is below the\n * proposed new threshold. Supports both flat layout (runs/run-*) and\n * per-project layout (runs/<project>/run-*). Returns an empty list\n * when runs_dir doesn't exist.\n */\nexport function scanStrandedRuns(\n runsDir: string,\n newThreshold: number,\n): StrandedRun[] {\n if (!existsSync(runsDir)) return [];\n\n const stranded: StrandedRun[] = [];\n\n const walkRun = (runPath: string, projectId: string | null): void => {\n const ckptPath = join(runPath, \"checkpoint.json\");\n if (!existsSync(ckptPath)) return;\n let ckpt: Record<string, unknown>;\n try {\n ckpt = JSON.parse(readFileSync(ckptPath, \"utf-8\"));\n } catch {\n return;\n }\n const stage = String(ckpt.current_stage || \"\");\n if (_TERMINAL_STAGES.has(stage)) return;\n\n const bestSat = ckpt.best_satisfaction;\n if (typeof bestSat !== \"number\") return;\n if (bestSat >= newThreshold) return;\n\n stranded.push({\n run_id: String(ckpt.run_id || \"\"),\n item_id:\n typeof ckpt.item_id === \"string\" || typeof ckpt.item_id === \"number\"\n ? String(ckpt.item_id)\n : null,\n best_satisfaction: bestSat,\n project_id: projectId,\n current_stage: stage,\n });\n };\n\n try {\n const entries = readdirSync(runsDir);\n for (const entry of entries) {\n const entryPath = join(runsDir, entry);\n let stat;\n try {\n stat = statSync(entryPath);\n } catch {\n continue;\n }\n if (!stat.isDirectory()) continue;\n\n if (entry.startsWith(\"run-\")) {\n // Flat layout\n walkRun(entryPath, null);\n } else if (!entry.startsWith(\".\")) {\n // Per-project subdir\n let subEntries: string[];\n try {\n subEntries = readdirSync(entryPath);\n } catch {\n continue;\n }\n for (const sub of subEntries) {\n if (!sub.startsWith(\"run-\")) continue;\n const subPath = join(entryPath, sub);\n try {\n if (statSync(subPath).isDirectory()) {\n walkRun(subPath, entry);\n }\n } catch {\n continue;\n }\n }\n }\n }\n } catch {\n return stranded;\n }\n\n return stranded;\n}\n\n// ── Route factory ──\n\nexport function getBoardRoutes(factoryDir: string): BoardRoute[] {\n return [\n // ── Status ──\n {\n method: \"GET\",\n pattern: \"/api/status\",\n handler: async () => {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n throw new Error(\"Not a valid factory: factory.json not found\");\n }\n const factoryIdentity = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n\n // Count projects (subdirectory format + flat format)\n const projectsDir = join(bmDir, \"projects\");\n let projectCount = 0;\n if (existsSync(projectsDir)) {\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n // Subdirectory: projects/{name}/project.json\n if (existsSync(join(projectsDir, entry, \"project.json\"))) { projectCount++; continue; }\n // Flat: projects/{name}.json (legacy)\n if (entry.endsWith(\".json\")) projectCount++;\n }\n }\n\n // Plugin names from lock\n const lockPath = join(bmDir, \"extensions.lock\");\n let pluginNames: string[] = [];\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n pluginNames = Object.keys(lock.plugins || {});\n } catch { /* empty */ }\n }\n\n // MCP servers\n let mcpServers: Record<string, unknown> = {};\n try {\n mcpServers = listMcps(factoryDir);\n } catch { /* empty */ }\n\n // Hooks\n let hooks: Record<string, unknown[]> = {};\n try {\n hooks = listHooks(factoryDir);\n } catch { /* empty */ }\n\n // Skills\n let skillCount = 0;\n try {\n skillCount = listSkills(factoryDir).length;\n } catch { /* empty */ }\n\n // Runs\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => {\n if (d.startsWith(\".\")) return false;\n try {\n return readdirSync(join(runsDir, d)).length > 0;\n } catch {\n return false;\n }\n })\n .sort();\n }\n\n // Daemon PID — check PID file first, then fall back to process detection\n const pidFile = join(factoryDir, \".beastmode\", \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch {\n pidAlive = false;\n }\n }\n // Fallback: detect daemon running via systemd or direct process\n if (!pidAlive) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\",\n timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n pidAlive = true;\n }\n }\n } catch {\n // pgrep not available or timed out — leave as stopped\n }\n }\n\n // Ask the board for the last daemon heartbeat. This works across\n // process/container/host boundaries where the PID check above\n // cannot see the daemon (e.g. Docker Compose, remote daemon).\n let daemonHeartbeatAgeSec: number | null = null;\n try {\n const hb = await proxyToBoard(\n getBoardUrl(factoryDir),\n \"GET\",\n \"/api/daemon/heartbeat\",\n ) as { seconds_ago: number | null };\n if (hb && typeof hb.seconds_ago === \"number\") {\n daemonHeartbeatAgeSec = hb.seconds_ago;\n }\n } catch {\n // Board unreachable — fall back to local PID check only.\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n daemonHeartbeatAgeSec,\n };\n\n return collectStatus(input);\n },\n },\n\n // ── Factory Status ──\n {\n method: \"GET\",\n pattern: \"/api/factory/status\",\n handler: async () => {\n // Determine daemon age: prefer the local .heartbeat file (bare-metal\n // and single-container deployments), fall back to the board's\n // in-memory heartbeat (works across containers where the UI can't\n // see the daemon's log directory, e.g. Docker Compose).\n const boardUrl = getBoardUrl(factoryDir);\n let ageSecs: number | null = null;\n\n const heartbeatPath = join(factoryDir, \"daemon\", \"logs\", \".heartbeat\");\n if (existsSync(heartbeatPath)) {\n try {\n const ts = parseInt(readFileSync(heartbeatPath, \"utf-8\").trim(), 10);\n if (!isNaN(ts)) {\n ageSecs = Math.floor(Date.now() / 1000) - ts;\n }\n } catch { /* ignore */ }\n }\n\n if (ageSecs === null) {\n try {\n const hb = await proxyToBoard(\n boardUrl,\n \"GET\",\n \"/api/daemon/heartbeat\",\n ) as { seconds_ago: number | null };\n if (hb && typeof hb.seconds_ago === \"number\") {\n ageSecs = hb.seconds_ago;\n }\n } catch { /* board unreachable — leave as unknown */ }\n }\n\n let daemonStatus: \"running\" | \"slow\" | \"stopped\" = \"stopped\";\n let lastSeen: string = \"unknown\";\n if (ageSecs !== null && ageSecs >= 0) {\n if (ageSecs < 120) {\n daemonStatus = \"running\";\n } else if (ageSecs < 300) {\n daemonStatus = \"slow\";\n } else {\n daemonStatus = \"stopped\";\n }\n if (ageSecs < 60) {\n lastSeen = `${ageSecs}s ago`;\n } else if (ageSecs < 3600) {\n lastSeen = `${Math.floor(ageSecs / 60)}m ago`;\n } else {\n lastSeen = `${Math.floor(ageSecs / 3600)}h ago`;\n }\n }\n\n // Read slots — Gap 31 fix. Two data sources:\n //\n // (1) totalSlots comes from the daemon's runtime config file\n // (config/beastmode.daemon.json or config/beastmode.docker.json\n // — the docker variant is what the Docker Compose daemon reads\n // via BEASTMODE_CONFIG). The old code read the FACTORY\n // config file under .beastmode/ (schema with `pipeline.*`,\n // `runtime.*` keys, NO `max_slots`) — so the UI always fell\n // through to a hardcoded default of 2 even when the daemon\n // was running 3 slots. The fix reads the DAEMON config,\n // which does define `max_slots`.\n //\n // (2) busySlots prefers the daemon-written .slots.json file when\n // present (written after every poll cycle with real occupancy).\n // Falls back to counting items with status=\"Working on it\"\n // via /api/poll's `working_on_it` list — but that's an item\n // status filter, NOT daemon slot occupancy. Items in review/\n // verify-prod/merge/heal phases occupy slots too but don't\n // have status=\"Working on it\", so the fallback undercounts.\n // The .slots.json path is the accurate source once the daemon\n // writes it (implementation ships alongside this UI change).\n let busySlots = 0;\n let totalSlots = 3; // default — matches DaemonConfig.max_slots default\n let shortPhaseReserve: number | undefined;\n let slotsTimestamp: number | undefined;\n\n // Preferred: read the daemon's own slots report if available.\n const slotsPath = join(factoryDir, \"daemon\", \"logs\", \".slots.json\");\n let usedDaemonSlotsFile = false;\n if (existsSync(slotsPath)) {\n try {\n const slots = JSON.parse(readFileSync(slotsPath, \"utf-8\"));\n if (typeof slots.busy === \"number\" && typeof slots.total === \"number\") {\n busySlots = slots.busy;\n totalSlots = slots.total;\n usedDaemonSlotsFile = true;\n }\n if (typeof slots.short_phase_reserve === \"number\") {\n shortPhaseReserve = slots.short_phase_reserve;\n }\n if (typeof slots.timestamp === \"number\") {\n slotsTimestamp = slots.timestamp;\n }\n } catch { /* ignore — fall back to heuristics below */ }\n }\n\n if (!usedDaemonSlotsFile) {\n // Fallback: approximate busy count from working_on_it items.\n // Underestimates (won't count items in review/verify-prod/etc).\n try {\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll\") as Record<string, unknown>;\n const workingItems = poll[\"working_on_it\"];\n if (Array.isArray(workingItems)) {\n busySlots = workingItems.length;\n }\n } catch { /* board may not be running */ }\n\n // Fallback totalSlots: read max_slots from the daemon's runtime\n // config file. Try .docker.json first (Docker Compose setups),\n // then .daemon.json (bare-metal), then give up with the default.\n for (const name of [\"beastmode.docker.json\", \"beastmode.daemon.json\"]) {\n const configPath = join(factoryDir, \"config\", name);\n if (!existsSync(configPath)) continue;\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (typeof config.max_slots === \"number\") {\n totalSlots = config.max_slots;\n }\n // short_phase_reserve may appear in config before daemon writes .slots.json\n if (shortPhaseReserve === undefined && typeof config.short_phase_reserve === \"number\") {\n shortPhaseReserve = config.short_phase_reserve;\n }\n if (typeof config.max_slots === \"number\") {\n break;\n }\n } catch { /* keep trying other paths */ }\n }\n }\n\n // Default short_phase_reserve to 1 (matches DaemonConfig default) when\n // neither .slots.json nor the config file provides the value.\n if (shortPhaseReserve === undefined) {\n shortPhaseReserve = Math.max(0, Math.min(1, totalSlots - 1));\n }\n\n // Read alerts\n const alertsPath = join(factoryDir, \"daemon\", \"logs\", \".alerts.json\");\n let alerts: unknown[] = [];\n if (existsSync(alertsPath)) {\n try {\n const parsed = JSON.parse(readFileSync(alertsPath, \"utf-8\"));\n if (Array.isArray(parsed)) alerts = parsed;\n } catch { /* ignore */ }\n }\n\n return {\n daemon: daemonStatus,\n lastSeen,\n slots: {\n total: totalSlots,\n busy: Math.min(busySlots, totalSlots),\n free: Math.max(totalSlots - busySlots, 0),\n short_phase_reserve: shortPhaseReserve,\n ...(slotsTimestamp !== undefined ? { timestamp: slotsTimestamp } : {}),\n },\n alerts,\n };\n },\n },\n\n // ── Pipeline configuration (Story 1 / pipeline-board-view epic) ──\n // Direct passthrough — the scenarios specifically test\n // http://ui:8080/api/pipeline-config (no /api/board/ prefix) because\n // that matches the backend route path verbatim. Exposing at a different\n // path would break those scenarios. See\n // docs/zero-to-productive-readiness.md Gap 8 for the systemic version\n // of this bug: the UI proxy allowlist is an invisible contract the\n // planner ignores, so new backend routes need matching UI proxy\n // entries. This is one of those entries, added post-hoc to unstick\n // board item 9 (Story 1).\n {\n method: \"GET\",\n pattern: \"/api/pipeline-config\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", \"/api/pipeline-config\", undefined, scopedQuery(query));\n },\n },\n\n // ── Telemetry status (Gap 15: opt-in anonymous telemetry) ──\n // Direct passthrough proxy — matches the backend route path verbatim\n // so the Settings UI can fetch /api/telemetry/status through the UI\n // server at http://ui:8080. Same pattern as /api/pipeline-config.\n {\n method: \"GET\",\n pattern: \"/api/telemetry/status\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", \"/api/telemetry/status\", undefined, scopedQuery(query));\n },\n },\n\n // ── Environment config (Story 1 / multi-env lifecycle epic — Gap 17) ──\n // Direct passthrough proxies so browser_any scenarios can verify\n // the resolver at http://ui:8080/api/environments and\n // /api/debug/env-config. Skipping these entries is the exact\n // failure mode documented in Gap 8 (\"UI proxy allowlist is an\n // invisible contract the planner ignores\") — do NOT remove.\n //\n // These endpoints use the `project` query param (not `board`) to\n // select which project's env config to return. scopedQuery() only\n // forwards the `board` param, so we extract `project` explicitly.\n {\n method: \"GET\",\n pattern: \"/api/environments\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const fwd = query?.project ? { project: query.project } : undefined;\n return proxyToBoard(boardUrl, \"GET\", \"/api/environments\", undefined, fwd);\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/debug/env-config\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const fwd = query?.project ? { project: query.project } : undefined;\n return proxyToBoard(boardUrl, \"GET\", \"/api/debug/env-config\", undefined, fwd);\n },\n },\n\n // ── Board Items (proxy to existing board at :8080) ──\n // Every proxy forwards the `board` query param so the Python server\n // can route to the correct per-project SQLite database. `\"all\"` is\n // treated as the default (aggregate) board.\n {\n method: \"GET\",\n pattern: \"/api/board/items\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const bq = scopedQuery(query);\n\n if (!bq) {\n // \"All Projects\" mode — server-side aggregation via /api/poll-all.\n // The board server owns the SQLite layer and filters ephemeral\n // verify/test boards plus the default (legacy) database. Items\n // arrive pre-tagged with `project_id`.\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll-all\") as Record<string, unknown>;\n const seen = new Set<string>();\n const allItems: unknown[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (!Array.isArray(items)) continue;\n for (const item of items) {\n const rec = item as Record<string, unknown>;\n const key = String(rec.project_id ?? \"\") + \":\" + String(rec.id ?? \"\");\n if (seen.has(key)) continue;\n seen.add(key);\n allItems.push({ ...rec, status_bucket: status });\n }\n }\n return { items: allItems };\n }\n\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll\", undefined, bq) as Record<string, unknown>;\n // Flatten all status buckets into a single items array.\n // Deduplicate by item ID — critical items appear in both their\n // status bucket and the \"critical\" bucket.\n const seen = new Set<string>();\n const allItems: unknown[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items)) {\n for (const item of items) {\n const id = String((item as Record<string, unknown>).id ?? \"\");\n if (id && seen.has(id)) continue;\n if (id) seen.add(id);\n allItems.push({ ...item as Record<string, unknown>, status_bucket: status });\n }\n }\n }\n return { items: allItems };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/items\",\n handler: async (body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", \"/api/items\", body, scopedQuery(query));\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/board/items/:id\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"PATCH\", `/api/items/${params.id}`, body, scopedQuery(query));\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/board/items/:id\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"DELETE\", `/api/items/${params.id}`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/board/items/:id/updates\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", `/api/items/${params.id}/updates`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/items/:id/updates\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", `/api/items/${params.id}/updates`, body, scopedQuery(query));\n },\n },\n\n // ── Attachments (Gap 8a — 2026-04-15) ──\n // The board service stores per-item attachments (screenshots from\n // verify_production.py, uploaded files from the \"new task\"\n // dialog, etc.) at /app/data/attachments/<project>/<item>/<id>_<name>.\n // Before this proxy existed, the UI had no way to list or fetch\n // them, which meant Story 4's Done Evidence message said \"2\n // screenshots attached\" but the UI showed nothing. See\n // docs/zero-to-productive-readiness.md Gap 8a.\n {\n method: \"GET\",\n pattern: \"/api/board/items/:id/attachments\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(\n boardUrl,\n \"GET\",\n `/api/items/${params.id}/attachments`,\n undefined,\n scopedQuery(query),\n );\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/board/attachments/:id/download\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n // Binary response — returns BinaryResponse which the\n // dispatcher in server.ts writes directly without JSON\n // serialization.\n return proxyBinaryToBoard(\n boardUrl,\n `/api/attachments/${params.id}/download`,\n scopedQuery(query),\n );\n },\n },\n\n // ── Replies ──\n {\n method: \"GET\",\n pattern: \"/api/board/updates/:id/replies\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", `/api/updates/${params.id}/replies`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/updates/:id/replies\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", `/api/updates/${params.id}/replies`, body, scopedQuery(query));\n },\n },\n\n // ── Extensions: Plugins ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/plugins\",\n handler: () => {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n return { plugins: {} };\n }\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n return { plugins: lock.plugins || {} };\n } catch {\n return { plugins: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/plugins\",\n handler: async (body) => {\n const { source } = body as { source?: string };\n if (!source) throw new Error(\"Missing required field: source\");\n await installPlugin(factoryDir, source);\n return { success: true, source };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/plugins/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removePlugin(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Registry ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/registry\",\n handler: async () => {\n try {\n const index = await fetchRegistryIndex(factoryDir);\n return index;\n } catch (err) {\n // Return empty registry on fetch failure\n return { plugins: [], updated_at: new Date().toISOString() };\n }\n },\n },\n\n // ── Extensions: MCPs ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/mcps\",\n handler: () => {\n try {\n return { servers: listMcps(factoryDir) };\n } catch {\n return { servers: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/mcps\",\n handler: (body) => {\n const { name, command, args, config } = body as {\n name?: string;\n command?: string;\n args?: string[];\n config?: Record<string, unknown>;\n };\n if (!name) throw new Error(\"Missing required field: name\");\n if (!command) throw new Error(\"Missing required field: command\");\n\n addMcp(factoryDir, name, {\n command,\n args: args || [],\n config: config || {},\n source: \"user\",\n enabled: true,\n });\n return { success: true };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/mcps/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removeMcp(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Skills ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/skills\",\n handler: () => {\n try {\n return { skills: listSkills(factoryDir) };\n } catch {\n return { skills: [] };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/skills\",\n handler: (body) => {\n const { name, description, body: skillBody } = body as {\n name?: string;\n description?: string;\n body?: string;\n };\n if (!name) throw new Error(\"Missing required field: name\");\n if (!description) throw new Error(\"Missing required field: description\");\n if (!skillBody) throw new Error(\"Missing required field: body\");\n const created = createSkill(factoryDir, name, description, skillBody);\n return { success: true, ...created };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/skills/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removeSkill(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Hooks ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/hooks\",\n handler: () => {\n try {\n return { hooks: listHooks(factoryDir) };\n } catch {\n return { hooks: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/hooks\",\n handler: (body) => {\n const { event, name, command, skill, webhook, config } = body as {\n event?: string;\n name?: string;\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n };\n if (!event) throw new Error(\"Missing required field: event\");\n if (!name) throw new Error(\"Missing required field: name\");\n if (!command && !skill && !webhook) {\n throw new Error(\"At least one of command, skill, or webhook is required\");\n }\n\n addHook(factoryDir, event as HookEvent, {\n name,\n command,\n skill,\n webhook,\n config: config || {},\n source: \"user\",\n });\n return { success: true };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/hooks/:event/:name\",\n handler: (_body, params) => {\n const { event, name } = params;\n removeHook(factoryDir, event as HookEvent, name);\n return { success: true };\n },\n },\n\n // ── Projects ──\n {\n method: \"GET\",\n pattern: \"/api/projects\",\n handler: () => {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return { projects: [] };\n\n const projects: unknown[] = [];\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n // Subdirectory format: projects/{name}/project.json\n const subDirPath = join(projectsDir, entry, \"project.json\");\n if (existsSync(subDirPath)) {\n try { projects.push(JSON.parse(readFileSync(subDirPath, \"utf-8\"))); } catch { /* skip */ }\n continue;\n }\n // Flat format: projects/{name}.json (legacy)\n if (entry.endsWith(\".json\")) {\n try { projects.push(JSON.parse(readFileSync(join(projectsDir, entry), \"utf-8\"))); } catch { /* skip */ }\n }\n }\n\n return { projects };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/projects/:name\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n // Try subdirectory format first, then flat\n const subDirPath = join(factoryDir, \".beastmode\", \"projects\", name, \"project.json\");\n const flatPath = join(factoryDir, \".beastmode\", \"projects\", `${name}.json`);\n const filePath = existsSync(subDirPath) ? subDirPath : flatPath;\n if (!existsSync(filePath)) throw new Error(`Project not found: ${name}`);\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/projects/:name/extensions\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n const extPath = join(factoryDir, \".beastmode\", \"projects\", name, \"extensions.json\");\n if (!existsSync(extPath)) {\n return { plugins: { add: [], remove: [] }, mcps: { add: {}, remove: [] }, skills: { add: [], remove: [] } };\n }\n try {\n return JSON.parse(readFileSync(extPath, \"utf-8\"));\n } catch {\n return { plugins: { add: [], remove: [] }, mcps: { add: {}, remove: [] }, skills: { add: [], remove: [] } };\n }\n },\n },\n {\n // Filesystem browser for the Add Project picker.\n //\n // POST body: { path?: string } — absolute directory to list (default: $HOME)\n //\n // Returns { path, parent, entries: [{name, path, is_dir, has_git}] }.\n // Only directories are returned (the picker only selects dirs).\n // This is behind the board's password auth, so it trusts the caller\n // with full filesystem read access — the daemon's trust boundary\n // already allows cloning arbitrary repos and reading arbitrary code.\n method: \"POST\",\n pattern: \"/api/filesystem/browse\",\n handler: (body) => {\n const { path: queryPath } = (body || {}) as { path?: string };\n const startPath = queryPath || homedir();\n const target = resolve(startPath);\n if (!existsSync(target)) throw new Error(`Path not found: ${target}`);\n const st = statSync(target);\n if (!st.isDirectory()) throw new Error(`Not a directory: ${target}`);\n\n let entries: Array<{ name: string; path: string; is_dir: boolean; has_git: boolean }> = [];\n try {\n entries = readdirSync(target, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith(\".\"))\n .map((d) => {\n const full = join(target, d.name);\n return {\n name: d.name,\n path: full,\n is_dir: true,\n has_git: existsSync(join(full, \".git\")),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n } catch {\n // If we can't list (permission denied etc.), return empty\n entries = [];\n }\n\n const parent = dirname(target);\n return {\n path: target,\n parent: parent !== target ? parent : null,\n entries,\n };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/projects\",\n handler: (body) => {\n const { path: projectPath, github_url, clone_target } = body as {\n path?: string;\n github_url?: string;\n clone_target?: string;\n };\n\n // Ensure .beastmode/projects/ exists before any work (clone, write).\n // On fresh installs (e.g. bind-mounted .beastmode in Docker) only\n // factory.json is present, so writing the project file would ENOENT.\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) mkdirSync(projectsDir, { recursive: true });\n\n let resolvedPath: string;\n\n if (github_url) {\n // Clone mode: validate URL, clone into target dir, then register\n const url = github_url.trim();\n // Accept https://github.com/owner/repo(.git) or git@github.com:owner/repo.git\n if (!/^(https?:\\/\\/|git@)/.test(url)) {\n throw new Error(\"Invalid github_url — must start with https:// or git@\");\n }\n // Derive repo name from URL\n const repoName = url\n .replace(/\\.git$/, \"\")\n .split(/[/:]/)\n .filter(Boolean)\n .pop() || \"\";\n if (!repoName) throw new Error(\"Could not derive repo name from URL\");\n\n // Decide clone target dir\n const baseDir = clone_target\n ? resolve(clone_target)\n : process.env.BEASTMODE_CLONE_DIR\n ? resolve(process.env.BEASTMODE_CLONE_DIR)\n : join(homedir(), \"repos\");\n if (!existsSync(baseDir)) mkdirSync(baseDir, { recursive: true });\n\n resolvedPath = join(baseDir, repoName);\n if (existsSync(resolvedPath)) {\n throw new Error(`Target path already exists: ${resolvedPath} — pick a different clone_target or rename the existing folder`);\n }\n\n // For private github.com repos, inject a credential helper that reads\n // the token from the environment. The helper is a shell snippet that\n // git runs when it needs credentials — the token stays in env, never\n // in argv or in the cloned repo's .git/config.\n // GIT_TERMINAL_PROMPT=0 makes git fail fast instead of hanging when\n // no credentials are available (e.g., inside a container with no TTY).\n const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN || \"\";\n const cloneEnv: NodeJS.ProcessEnv = {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n };\n const gitArgs: string[] = [];\n if (token && /^https:\\/\\/github\\.com\\//i.test(url)) {\n cloneEnv.BEASTMODE_GH_TOKEN = token;\n // Clear any inherited helpers, then install our env-backed helper.\n gitArgs.push(\"-c\", \"credential.helper=\");\n gitArgs.push(\n \"-c\",\n `credential.https://github.com.helper=!f() { echo \"username=x-access-token\"; echo \"password=$BEASTMODE_GH_TOKEN\"; }; f`,\n );\n }\n gitArgs.push(\"clone\", url, resolvedPath);\n // Use spawnSync with argv array (no shell) so the token never appears\n // in any shell-expanded command line.\n const result = spawnSync(\"git\", gitArgs, {\n stdio: \"pipe\",\n timeout: 300000, // 5 min\n env: cloneEnv,\n });\n if (result.status !== 0) {\n const stderr = result.stderr?.toString() || \"\";\n const stdout = result.stdout?.toString() || \"\";\n const errMsg = stderr.trim() || stdout.trim() || (result.error ? result.error.message : `exit ${result.status}`);\n throw new Error(`git clone failed: ${errMsg}`);\n }\n } else if (projectPath) {\n resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) throw new Error(`Directory not found: ${resolvedPath}`);\n } else {\n throw new Error(\"Missing required field: provide either `path` (local) or `github_url` (clone)\");\n }\n\n const projectName = basename(resolvedPath);\n const stack = detectStack(resolvedPath);\n\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n repo: stack.git_remote || undefined,\n stack: {\n detected: stack.framework,\n build_command: stack.suggested_commands.build,\n dev_command: stack.suggested_commands.dev,\n test_command: stack.suggested_commands.test,\n install_command: stack.suggested_commands.install,\n dev_port: stack.dev_port,\n },\n deploy: { target: stack.suggested_deploy },\n plugins: stack.suggested_plugins,\n infra: {\n credentials: {\n mode: \"factory\",\n },\n state_backend: \"auto\",\n },\n };\n\n const projName = projectName;\n const projectFile = join(projectsDir, `${projName}.json`);\n writeFileSync(projectFile, JSON.stringify(projectConfig, null, 2) + \"\\n\", \"utf-8\");\n\n // Create infra directory structure for the project\n const infraDir = join(projectsDir, projName, \"infra\");\n const terraformDir = join(infraDir, \"terraform\");\n const ciDir = join(infraDir, \"ci\");\n mkdirSync(terraformDir, { recursive: true });\n mkdirSync(ciDir, { recursive: true });\n\n return projectConfig;\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/projects/:name\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n // Support both formats: subdir (projects/{name}/project.json) and flat (projects/{name}.json).\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n const subDir = join(projectsDir, name);\n const flatPath = join(projectsDir, `${name}.json`);\n const hasSubDir = existsSync(join(subDir, \"project.json\"));\n const hasFlat = existsSync(flatPath);\n if (!hasSubDir && !hasFlat) throw new Error(`Project not found: ${name}`);\n // Remove whichever artifacts exist. A project may have BOTH (e.g. flat\n // config + subdir containing brownfield.md) — clean up both.\n if (hasSubDir) rmSync(subDir, { recursive: true, force: true });\n else if (existsSync(subDir)) rmSync(subDir, { recursive: true, force: true });\n if (hasFlat) unlinkSync(flatPath);\n return { success: true };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/projects/:name/analyze\",\n handler: async (_body, params) => {\n const { name } = params;\n // Support both formats: subdir (projects/{name}/project.json) and flat (projects/{name}.json).\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n const subDirConfigPath = join(projectsDir, name, \"project.json\");\n const flatConfigPath = join(projectsDir, `${name}.json`);\n const projPath = existsSync(subDirConfigPath)\n ? subDirConfigPath\n : existsSync(flatConfigPath) ? flatConfigPath : null;\n if (!projPath) throw new Error(`Project not found: ${name}`);\n // For now, create a placeholder brownfield.md\n // Full brownfield analysis will be done by spawning Claude (future enhancement)\n const projConfig = JSON.parse(readFileSync(projPath, \"utf-8\"));\n // brownfield.md always goes in the subdir (strategy.ts and other\n // consumers look there). Create the subdir if the project is in flat\n // form — GET skips empty subdirs so no double-listing.\n const subDir = join(projectsDir, name);\n if (!existsSync(subDir)) mkdirSync(subDir, { recursive: true });\n const brownfieldPath = join(subDir, \"brownfield.md\");\n if (!existsSync(brownfieldPath)) {\n const { detectStack: detectStackFn } = await import(\"../../engine/index.js\");\n let stackInfo = \"Unknown stack\";\n try {\n const stack = detectStackFn(projConfig.path) as unknown as Record<string, unknown>;\n const cmds = stack.suggested_commands as Record<string, unknown> | undefined;\n stackInfo = `Framework: ${stack.framework || \"unknown\"}\\nBuild: ${cmds?.build || \"unknown\"}\\nDev: ${cmds?.dev || \"unknown\"}`;\n } catch { /* ignore */ }\n writeFileSync(brownfieldPath, `# Brownfield Analysis: ${name}\\n\\n${stackInfo}\\n\\nPath: ${projConfig.path}\\n`);\n }\n return { analyzed: true, project: name };\n },\n },\n\n // ── Runs ──\n {\n method: \"GET\",\n pattern: \"/api/runs\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n if (!existsSync(runsDir)) return { runs: [] };\n\n // Collect runs from both flat (runs/run-*) and project-scoped\n // (runs/{project}/run-*) directories.\n const runEntries: { id: string; dir: string; projectId: string }[] = [];\n for (const entry of readdirSync(runsDir)) {\n if (entry.startsWith(\".\")) continue;\n const entryPath = join(runsDir, entry);\n try {\n const children = readdirSync(entryPath);\n if (entry.startsWith(\"run-\")) {\n // Flat layout: runs/run-xxx/\n if (children.length > 0) {\n runEntries.push({ id: entry, dir: entryPath, projectId: \"\" });\n }\n } else {\n // Project-scoped: runs/{project}/run-xxx/\n for (const child of children) {\n if (!child.startsWith(\"run-\") || child.startsWith(\".\")) continue;\n const childPath = join(entryPath, child);\n try {\n const grandchildren = readdirSync(childPath);\n if (grandchildren.length > 0) {\n runEntries.push({ id: child, dir: childPath, projectId: entry });\n }\n } catch { /* skip */ }\n }\n }\n } catch { continue; }\n }\n\n // Deduplicate by run ID — prefer project-scoped over flat\n const deduped = new Map<string, typeof runEntries[0]>();\n for (const entry of runEntries) {\n const existing = deduped.get(entry.id);\n if (!existing || (entry.projectId && !existing.projectId)) {\n deduped.set(entry.id, entry);\n }\n }\n\n const runs = Array.from(deduped.values())\n .sort((a, b) => b.id.localeCompare(a.id))\n .map(({ id, dir, projectId }) => {\n const manifest = readJsonFile(join(dir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(dir, \"checkpoint.json\"));\n const prodVerif = readJsonFile(join(dir, \"prod-verification.json\")) as Record<string, unknown> | null;\n const manifestData = manifest as Record<string, unknown> | null;\n const cpData = checkpoint as Record<string, unknown> | null;\n const prodAcceptFloor = 0.65; // matches daemon config\n // Prod verified = has prod-verification results with satisfaction above floor\n // (ceiling acceptance counts as verified), OR checkpoint terminal state\n const prodSat = prodVerif?.satisfaction as number | undefined;\n const prodVerified = (typeof prodSat === \"number\" && prodSat >= prodAcceptFloor) ||\n (cpData?.current_stage === \"done\") || (cpData?.current_stage === \"shipped\");\n return {\n id,\n taskName: manifestData?.description || manifestData?.task_description || manifestData?.item_name || manifestData?.task_name || id,\n projectId: projectId || (manifestData?.project_id as string) || \"\",\n itemId: manifestData?.item_id || manifestData?.monday_item_id || \"\",\n taskType: manifestData?.task_type || \"\",\n createdAt: manifestData?.created_at || \"\",\n manifest: manifest || {},\n checkpoint: checkpoint || {},\n pinned: isRunPinned(runsDir, id),\n prodVerified,\n };\n });\n\n return { runs };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/runs/:id\",\n handler: (_body, params, query) => {\n const { id } = params;\n const runsDir = getRunsDir(factoryDir);\n // Search flat and project-scoped paths\n let runDir = join(runsDir, id);\n if (!existsSync(runDir)) {\n // Search project subdirs\n for (const proj of readdirSync(runsDir)) {\n if (proj.startsWith(\".\") || proj.startsWith(\"run-\")) continue;\n const candidate = join(runsDir, proj, id);\n if (existsSync(candidate)) { runDir = candidate; break; }\n }\n }\n if (!existsSync(runDir)) throw new Error(`Run not found: ${id}`);\n\n const manifest = readJsonFile(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(runDir, \"checkpoint.json\"));\n\n // Collect iteration data\n const iterationsDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterationsDir)) {\n const iterDirs = readdirSync(iterationsDir).sort();\n for (const iterDir of iterDirs) {\n const satisfaction = readJsonFile(\n join(iterationsDir, iterDir, \"satisfaction.json\")\n );\n iterations.push({\n number: parseInt(iterDir, 10),\n satisfaction: satisfaction || null,\n });\n }\n }\n\n const manifestData = manifest as Record<string, unknown> | null;\n return {\n id,\n taskName: manifestData?.description || manifestData?.task_description || manifestData?.item_name || manifestData?.task_name || id,\n projectId: manifestData?.project_id || \"\",\n itemId: manifestData?.item_id || manifestData?.monday_item_id || \"\",\n taskType: manifestData?.task_type || \"\",\n createdAt: manifestData?.created_at || \"\",\n manifest: manifest || {},\n checkpoint: checkpoint || {},\n iterations,\n };\n },\n },\n\n // ── Archival ──\n {\n method: \"POST\",\n pattern: \"/api/runs/archive\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n let days = 7;\n if (existsSync(configPath)) {\n try { days = (JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>).archive_after_days as number || 7; } catch { /* ignore */ }\n }\n return archiveOldRuns(runsDir, days);\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/runs/:id/pin\",\n handler: (_body, params) => {\n return { pinned: pinRun(getRunsDir(factoryDir), params.id) };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/runs/:id/pin\",\n handler: (_body, params) => {\n return { unpinned: unpinRun(getRunsDir(factoryDir), params.id) };\n },\n },\n\n // ── Config ──\n {\n method: \"GET\",\n pattern: \"/api/config\",\n handler: () => {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const raw: Record<string, unknown> = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n return raw;\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/config\",\n handler: (body) => {\n const updates = body as Record<string, unknown>;\n if (!updates || typeof updates !== \"object\") {\n throw new Error(\"Request body must be a JSON object\");\n }\n\n // Extract force flag (not persisted to disk)\n const force = Boolean(\n (updates as Record<string, unknown>).force ||\n (updates as Record<string, unknown>)._force\n );\n // Strip force from updates so it never lands in config.json\n const updatesClean = { ...(updates as Record<string, unknown>) };\n delete updatesClean.force;\n delete updatesClean._force;\n\n // Update UI config (.beastmode/config.json)\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const current = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n\n // Threshold safety check (feature #7): detect raise, scan active\n // runs, return warning if any are stranded.\n if (!force) {\n const oldPipeline = (current.pipeline || {}) as Record<string, unknown>;\n const newPipeline = ((updatesClean as Record<string, unknown>).pipeline || {}) as Record<string, unknown>;\n\n const oldSat = typeof oldPipeline.satisfaction_threshold === \"number\"\n ? oldPipeline.satisfaction_threshold : null;\n const newSat = typeof newPipeline.satisfaction_threshold === \"number\"\n ? newPipeline.satisfaction_threshold : null;\n const oldFloor = typeof oldPipeline.prod_accept_floor === \"number\"\n ? oldPipeline.prod_accept_floor : null;\n const newFloor = typeof newPipeline.prod_accept_floor === \"number\"\n ? newPipeline.prod_accept_floor : null;\n\n const satRaised = oldSat !== null && newSat !== null && newSat > oldSat;\n const floorRaised = oldFloor !== null && newFloor !== null && newFloor > oldFloor;\n\n if (satRaised || floorRaised) {\n const candidates: number[] = [];\n if (satRaised && newSat !== null) candidates.push(newSat);\n if (floorRaised && newFloor !== null) candidates.push(newFloor);\n const effectiveThreshold = Math.max(...candidates);\n\n const stranded = scanStrandedRuns(\n getRunsDir(factoryDir),\n effectiveThreshold,\n );\n if (stranded.length > 0) {\n return {\n warning: `${stranded.length} active run(s) cannot converge at the new threshold.`,\n stranded_runs: stranded,\n confirm_required: true,\n attempted_threshold: effectiveThreshold,\n old_threshold: satRaised ? oldSat : oldFloor,\n };\n }\n }\n }\n\n const merged = deepMerge(current, updatesClean);\n writeFileSync(configPath, JSON.stringify(merged, null, 2) + \"\\n\", \"utf-8\");\n\n // Sync daemon-relevant fields to daemon config files.\n // The daemon's Pydantic DaemonConfig does not define a `pipeline`\n // section — it reads thresholds from `verification.*` and\n // `convergence.*`. Map factory pipeline keys to their daemon homes\n // explicitly instead of copying into an ignored `pipeline` subtree.\n //\n // We sync to BOTH `beastmode.daemon.json` (bare-metal daemon) and\n // `beastmode.docker.json` (Docker Compose daemon, BEASTMODE_CONFIG\n // points to this in docker-compose.yml) when either exists. Users\n // may deploy either way, and the UI has no way to know which file\n // the running daemon is actually reading.\n const daemonConfigPaths = [\n join(factoryDir, \"config\", \"beastmode.daemon.json\"),\n join(factoryDir, \"config\", \"beastmode.docker.json\"),\n ].filter(existsSync);\n\n // Factory `pipeline.*` keys that map into daemon sections.\n // Keys not listed here (preset, stages) are\n // factory-only and intentionally not synced.\n const pipelineToDaemonMap: Record<string, [string, string]> = {\n satisfaction_threshold: [\"verification\", \"satisfaction_threshold\"],\n prod_accept_floor: [\"verification\", \"prod_accept_floor\"],\n max_iterations: [\"convergence\", \"max_iterations\"],\n fail_fast_threshold: [\"convergence\", \"fail_fast_threshold\"],\n };\n const daemonFields = [\"max_slots\", \"max_projects\", \"poll_interval_seconds\", \"stale_task_hours\", \"runs_path\"];\n const flatDictSections: Array<\"models\" | \"migration_safety\" | \"alerts\" | \"human_gates\"> = [\n \"models\", \"migration_safety\", \"alerts\", \"human_gates\",\n ];\n\n for (const daemonConfigPath of daemonConfigPaths) {\n try {\n const daemonConfig = JSON.parse(readFileSync(daemonConfigPath, \"utf-8\")) as Record<string, unknown>;\n let changed = false;\n for (const field of daemonFields) {\n if (field in merged && merged[field] !== daemonConfig[field]) {\n daemonConfig[field] = merged[field];\n changed = true;\n }\n }\n\n if (merged.pipeline && typeof merged.pipeline === \"object\") {\n const mergedPipeline = merged.pipeline as Record<string, unknown>;\n for (const [srcKey, [section, destKey]] of Object.entries(pipelineToDaemonMap)) {\n if (!(srcKey in mergedPipeline)) continue;\n const val = mergedPipeline[srcKey];\n if (val === undefined) continue;\n if (!daemonConfig[section] || typeof daemonConfig[section] !== \"object\") {\n daemonConfig[section] = {};\n }\n const bucket = daemonConfig[section] as Record<string, unknown>;\n if (bucket[destKey] !== val) {\n bucket[destKey] = val;\n changed = true;\n }\n }\n }\n\n for (const section of flatDictSections) {\n const src = merged[section];\n if (src && typeof src === \"object\") {\n if (!daemonConfig[section] || typeof daemonConfig[section] !== \"object\") {\n daemonConfig[section] = {};\n }\n const bucket = daemonConfig[section] as Record<string, unknown>;\n for (const [k, v] of Object.entries(src as Record<string, unknown>)) {\n if (bucket[k] !== v) {\n bucket[k] = v;\n changed = true;\n }\n }\n }\n }\n\n if (changed) {\n writeFileSync(daemonConfigPath, JSON.stringify(daemonConfig, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch { /* non-fatal — one daemon config file may be malformed */ }\n }\n\n return merged;\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/config/reset\",\n handler: (body) => {\n const { keyPath } = (body || {}) as { keyPath?: string };\n\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const current = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : {};\n\n const result = configReset(current, keyPath);\n writeFileSync(configPath, JSON.stringify(result, null, 2) + \"\\n\", \"utf-8\");\n return result;\n },\n },\n\n // ── Chat History ──\n {\n method: \"GET\",\n pattern: \"/api/chat/history\",\n handler: () => {\n return { conversations: listConversations(factoryDir) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/chat/history/:id\",\n handler: (_body, params) => {\n const messages = loadConversation(factoryDir, params.id);\n return { messages };\n },\n },\n\n // ── Products / Inception ──\n {\n method: \"GET\",\n pattern: \"/api/products\",\n handler: async () => {\n const { listProducts } = await import(\"./inception.js\");\n return { products: listProducts(factoryDir) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/products/:name\",\n handler: async (_body, params) => {\n const { loadInception } = await import(\"./inception.js\");\n const state = loadInception(factoryDir, params.name);\n if (!state) throw new Error(`Product not found: ${params.name}`);\n return state;\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/products/:name/artifact/:artifact\",\n handler: async (_body, params) => {\n const { loadArtifact } = await import(\"./inception.js\");\n const content = loadArtifact(factoryDir, params.name, params.artifact);\n if (!content) throw new Error(`Artifact not found: ${params.artifact}`);\n return { content };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/methodologies\",\n handler: async () => {\n const { listMethodologies } = await import(\"./inception.js\");\n return { methodologies: listMethodologies() };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/products\",\n handler: async (body) => {\n const { productName, idea, methodology, interactionMode } = body as {\n productName?: string; idea?: string; methodology?: string; interactionMode?: string;\n };\n if (!productName || !idea || !methodology) {\n throw new Error(\"Missing required fields: productName, idea, methodology\");\n }\n const { createInceptionState } = await import(\"./inception.js\");\n return createInceptionState(factoryDir, {\n productName,\n idea,\n methodology,\n interactionMode: (interactionMode || \"interactive\") as \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\",\n });\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/products/:name/create-epics\",\n handler: async (_body, params) => {\n const { createEpicsOnBoard } = await import(\"./inception.js\");\n const boardUrl = getBoardUrl(factoryDir);\n return createEpicsOnBoard(factoryDir, params.name, boardUrl);\n },\n },\n\n // ── Learnings ──\n {\n method: \"GET\",\n pattern: \"/api/learnings\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n\n // Collect all retrospective directories: runs/.retrospectives and runs/{project}/.retrospectives\n const retroDirs: string[] = [];\n const rootRetroDir = join(runsDir, \".retrospectives\");\n if (existsSync(rootRetroDir)) retroDirs.push(rootRetroDir);\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n const projectRetroDir = join(runsDir, entry, \".retrospectives\");\n if (existsSync(projectRetroDir)) retroDirs.push(projectRetroDir);\n }\n }\n\n if (retroDirs.length === 0) {\n return { learnings: [], retrospectives: [], wisdom: \"\", wisdomMeta: {} };\n }\n\n const retrospectives: unknown[] = [];\n const learnings: unknown[] = [];\n\n for (const retroDir of retroDirs) {\n const retroFiles = readdirSync(retroDir)\n .filter(f => f.startsWith(\"run-\") && f.endsWith(\".json\"))\n .sort()\n .reverse();\n\n for (const file of retroFiles) {\n const data = readJsonFile(join(retroDir, file));\n if (!data) continue;\n const retro = data as Record<string, unknown>;\n retrospectives.push(retro);\n\n const retroLearnings = Array.isArray(retro.learnings) ? retro.learnings : [];\n for (let i = 0; i < retroLearnings.length; i++) {\n const learning = retroLearnings[i] as Record<string, unknown>;\n learnings.push({\n ...learning,\n _index: i,\n task_name: retro.task_name || \"\",\n task_id: retro.task_id || \"\",\n run_id: retro.run_id || \"\",\n outcome: retro.outcome || \"\",\n analyzed_at: retro.analyzed_at || \"\",\n });\n }\n }\n }\n\n // Read wisdom from the first retro dir that has one (prefer root)\n let wisdom = \"\";\n let wisdomMeta: unknown = {};\n for (const retroDir of retroDirs) {\n const wisdomPath = join(retroDir, \"wisdom.md\");\n if (existsSync(wisdomPath)) {\n wisdom = readFileSync(wisdomPath, \"utf-8\");\n wisdomMeta = readJsonFile(join(retroDir, \"wisdom-meta.json\")) || {};\n break;\n }\n }\n\n return { learnings, retrospectives, wisdom, wisdomMeta };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/learnings/wisdom/refresh\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n const retroDir = join(runsDir, \".retrospectives\");\n if (!existsSync(retroDir)) {\n mkdirSync(retroDir, { recursive: true });\n }\n writeFileSync(join(retroDir, \".refresh-requested\"), new Date().toISOString(), \"utf-8\");\n return { success: true };\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/learnings/:runId/:index/dismiss\",\n handler: (_body, params) => {\n // Search for the retrospective file across all retro dirs\n const runsDir = getRunsDir(factoryDir);\n const candidateDirs = [join(runsDir, \".retrospectives\")];\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n candidateDirs.push(join(runsDir, entry, \".retrospectives\"));\n }\n }\n let filePath: string | null = null;\n for (const dir of candidateDirs) {\n const candidate = join(dir, `${params.runId}.json`);\n if (existsSync(candidate)) { filePath = candidate; break; }\n }\n if (!filePath) throw new Error(`Retrospective not found: ${params.runId}`);\n const data = JSON.parse(readFileSync(filePath, \"utf-8\"));\n const idx = parseInt(params.index, 10);\n if (!Array.isArray(data.learnings) || idx < 0 || idx >= data.learnings.length) {\n throw new Error(`Learning index out of range: ${idx}`);\n }\n data.learnings[idx].dismissed = true;\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n return { success: true };\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/learnings/:runId/:index/restore\",\n handler: (_body, params) => {\n // Search for the retrospective file across all retro dirs\n const runsDir = getRunsDir(factoryDir);\n const candidateDirs = [join(runsDir, \".retrospectives\")];\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n candidateDirs.push(join(runsDir, entry, \".retrospectives\"));\n }\n }\n let filePath: string | null = null;\n for (const dir of candidateDirs) {\n const candidate = join(dir, `${params.runId}.json`);\n if (existsSync(candidate)) { filePath = candidate; break; }\n }\n if (!filePath) throw new Error(`Retrospective not found: ${params.runId}`);\n const data = JSON.parse(readFileSync(filePath, \"utf-8\"));\n const idx = parseInt(params.index, 10);\n if (!Array.isArray(data.learnings) || idx < 0 || idx >= data.learnings.length) {\n throw new Error(`Learning index out of range: ${idx}`);\n }\n data.learnings[idx].dismissed = false;\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n return { success: true };\n },\n },\n\n // ── Strategy ──\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions\",\n handler: async (_body, params) => {\n const { migrateInceptionToSession } = await import(\"./inception.js\");\n migrateInceptionToSession(factoryDir, params.project);\n const { listStrategySessions } = await import(\"./strategy.js\");\n return { sessions: listStrategySessions(factoryDir, params.project) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions/:sessionId\",\n handler: async (_body, params) => {\n const { loadStrategySession } = await import(\"./strategy.js\");\n const session = loadStrategySession(factoryDir, params.project, params.sessionId);\n if (!session) throw new Error(`Session not found: ${params.sessionId}`);\n return session;\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/strategy/:project/sessions\",\n handler: async (body, params) => {\n const { name, idea, methodology, interactionMode, buildOnSession, sessionType, approach } = body as Record<string, string>;\n if (!name || !idea || !methodology) throw new Error(\"Missing: name, idea, methodology\");\n const { createStrategySession } = await import(\"./strategy.js\");\n return createStrategySession(factoryDir, params.project, {\n name, idea, methodology,\n interactionMode: interactionMode || \"interactive\",\n buildOnSession,\n sessionType: sessionType || \"free-form\",\n approach: approach || \"auto\",\n });\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/index\",\n handler: async (_body, params) => {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n return buildArtifactIndex(factoryDir, params.project);\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions/:sessionId/artifact/:artifact\",\n handler: async (_body, params) => {\n const { loadSessionArtifact } = await import(\"./strategy.js\");\n const content = loadSessionArtifact(factoryDir, params.project, params.sessionId, params.artifact);\n if (!content) throw new Error(`Artifact not found: ${params.artifact}`);\n return { content };\n },\n },\n\n // ── Strategy Feed (aggregated activity) ──\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/feed\",\n handler: async (_body, params, query) => {\n const project = params.project;\n const limit = Math.min(Math.max(parseInt(query?.limit || \"20\", 10) || 20, 1), 50);\n const cursor = query?.cursor || null;\n\n interface FeedItem {\n type: string;\n title: string;\n subtitle?: string;\n timestamp: string;\n link?: string;\n id: string;\n }\n\n const allItems: FeedItem[] = [];\n\n // Source 1: Strategy sessions\n try {\n const { listStrategySessions } = await import(\"./strategy.js\");\n const sessions = listStrategySessions(factoryDir, project);\n for (const s of sessions) {\n const phasesDone = s.phases ? s.phases.filter(p => p.status === \"done\").length : 0;\n const phasesTotal = s.phases ? s.phases.length : 0;\n const typeLabel = s.sessionType || \"free-form\";\n const methodLabel = s.methodology || \"\";\n let subtitle = `${typeLabel} (${methodLabel})`;\n if (phasesTotal > 0) {\n subtitle += ` — phase ${phasesDone}/${phasesTotal}`;\n }\n allItems.push({\n type: \"session\",\n title: s.name,\n subtitle,\n timestamp: s.updatedAt || s.createdAt,\n link: `#/strategy-session/${s.sessionId}`,\n id: `session-${s.sessionId}`,\n });\n }\n } catch { /* source unavailable */ }\n\n // Source 2: Decisions (from board server)\n try {\n const boardUrl = getBoardUrl(factoryDir);\n const resp = await proxyToBoard(boardUrl, \"GET\", `/api/strategy/${project}/decisions`);\n const decisions = Array.isArray(resp) ? resp : ((resp as Record<string, unknown>)?.decisions as unknown[] || []);\n for (const d of decisions as Array<Record<string, unknown>>) {\n allItems.push({\n type: \"decision\",\n title: String(d.title || \"Untitled decision\"),\n subtitle: `Status: ${d.status || \"active\"}`,\n timestamp: String(d.updated_at || d.created_at || new Date().toISOString()),\n id: `decision-${d.id}`,\n });\n }\n } catch { /* board unreachable */ }\n\n // Source 3: Board items (tasks)\n try {\n const boardUrl = getBoardUrl(factoryDir);\n const resp = await proxyToBoard(boardUrl, \"GET\", \"/api/items\", undefined, { board: project });\n const tasks = Array.isArray(resp) ? resp : ((resp as Record<string, unknown>)?.items as unknown[] || []);\n for (const t of tasks as Array<Record<string, unknown>>) {\n const parts: string[] = [];\n if (t.status) parts.push(String(t.status));\n if (t.priority) parts.push(`P${t.priority}`);\n if (t.task_type) parts.push(String(t.task_type));\n allItems.push({\n type: \"task\",\n title: String(t.name || \"Untitled task\"),\n subtitle: parts.join(\" / \") || undefined,\n timestamp: String(t.updated_at || t.created_at || new Date().toISOString()),\n link: \"#/board\",\n id: `task-${t.id}`,\n });\n }\n } catch { /* board unreachable */ }\n\n // Source 4: Learnings (from artifact index)\n try {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n const index = buildArtifactIndex(factoryDir, project);\n const learnings = index.artifacts.filter(a => a.type === \"learning\");\n for (const l of learnings) {\n allItems.push({\n type: \"learning\",\n title: l.summary,\n timestamp: l.date,\n id: `learning-${l.path}`,\n });\n }\n } catch { /* source unavailable */ }\n\n // Source 5: Runs (from filesystem)\n try {\n const runsDir = join(factoryDir, \"runs\", project);\n if (existsSync(runsDir)) {\n const runDirs = readdirSync(runsDir).filter(d => d.startsWith(\"run-\"));\n for (const runId of runDirs) {\n const ckptPath = join(runsDir, runId, \"checkpoint.json\");\n let subtitle = \"\";\n let timestamp = \"\";\n try {\n const st = statSync(join(runsDir, runId));\n timestamp = st.mtime.toISOString();\n } catch {\n timestamp = new Date().toISOString();\n }\n if (existsSync(ckptPath)) {\n try {\n const ckpt = JSON.parse(readFileSync(ckptPath, \"utf-8\"));\n const history = ckpt.satisfaction_history as number[] | undefined;\n if (history && history.length > 0) {\n const latest = history[history.length - 1];\n subtitle = `Satisfaction: ${Math.round(latest * 100)}%`;\n }\n } catch { /* bad checkpoint */ }\n }\n allItems.push({\n type: \"run\",\n title: runId,\n subtitle: subtitle || undefined,\n timestamp,\n link: \"#/runs\",\n id: `run-${runId}`,\n });\n }\n }\n } catch { /* source unavailable */ }\n\n // Sort by timestamp descending\n allItems.sort((a, b) => {\n const ta = new Date(a.timestamp).getTime() || 0;\n const tb = new Date(b.timestamp).getTime() || 0;\n return tb - ta;\n });\n\n // Cursor-based pagination: find cursor position, return next `limit` items\n let startIndex = 0;\n if (cursor) {\n const cursorIdx = allItems.findIndex(item => item.id === cursor);\n if (cursorIdx >= 0) {\n startIndex = cursorIdx + 1;\n }\n }\n\n const page = allItems.slice(startIndex, startIndex + limit);\n const nextCursor = page.length === limit && startIndex + limit < allItems.length\n ? page[page.length - 1].id\n : null;\n\n return {\n items: page,\n total: allItems.length,\n nextCursor,\n };\n },\n },\n ];\n}\n\n// ── Pattern matching for routes with :params ──\n\nexport function matchBoardRoute(\n routes: BoardRoute[],\n method: string,\n url: string\n): { route: BoardRoute; params: Record<string, string> } | null {\n for (const route of routes) {\n if (route.method !== method) continue;\n\n const routeParts = route.pattern.split(\"/\");\n const urlParts = url.split(\"/\");\n\n if (routeParts.length !== urlParts.length) continue;\n\n const params: Record<string, string> = {};\n let match = true;\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(\":\")) {\n params[routeParts[i].slice(1)] = decodeURIComponent(urlParts[i]);\n } else if (routeParts[i] !== urlParts[i]) {\n match = false;\n break;\n }\n }\n\n if (match) return { route, params };\n }\n\n return null;\n}\n","import { createServer, type IncomingMessage, type ServerResponse, type Server } from \"http\";\nimport type { Duplex } from \"stream\";\nimport { createHmac } from \"crypto\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { WebSocketServer, WebSocket as WsClient } from \"ws\";\nimport { getRoutes, type Route } from \"./api-routes.js\";\nimport { getBoardRoutes, matchBoardRoute, BinaryResponse, HttpError, getBoardUrl, transparentProxyToBoard, type BoardRoute } from \"./board-api-routes.js\";\nimport { createChatManager, getRecentTokenUsage, type ChatManager } from \"./chat-handler.js\";\n\n\n// Single shared WebSocketServer for the /ws proxy — noServer mode so\n// we own the upgrade handshake. Created once at module load; re-used\n// across every client connection. Each proxy connection opens its own\n// outbound WebSocket to the board server.\nconst _boardWsProxy = new WebSocketServer({ noServer: true });\n\n\nfunction proxyBoardWebSocket(\n req: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n boardWsUrl: string,\n): void {\n // Complete the upgrade on the browser side first, THEN open the\n // upstream connection to the board. If the upstream is down, we\n // close the browser side with a clear reason instead of leaving\n // the handshake half-done.\n _boardWsProxy.handleUpgrade(req, socket, head, (clientWs) => {\n const upstream = new WsClient(boardWsUrl);\n let closed = false;\n const cleanup = (code: number, reason: string) => {\n if (closed) return;\n closed = true;\n try { clientWs.close(code, reason); } catch { /* noop */ }\n try { upstream.close(code, reason); } catch { /* noop */ }\n };\n\n upstream.on(\"open\", () => {\n clientWs.on(\"message\", (data) => {\n try { upstream.send(data); } catch { cleanup(1011, \"relay failed\"); }\n });\n upstream.on(\"message\", (data) => {\n try { clientWs.send(data); } catch { cleanup(1011, \"relay failed\"); }\n });\n });\n\n upstream.on(\"error\", () => cleanup(1011, \"board WS upstream error\"));\n upstream.on(\"close\", (code, reason) => cleanup(code || 1000, reason?.toString() || \"upstream closed\"));\n clientWs.on(\"error\", () => cleanup(1011, \"client WS error\"));\n clientWs.on(\"close\", (code, reason) => cleanup(code || 1000, reason?.toString() || \"client closed\"));\n });\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst INACTIVITY_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n projectPath?: string;\n factoryName?: string;\n factoryPath?: string;\n mode?: \"init\" | \"board\";\n}\n\nexport interface UIServer {\n server: Server;\n port: number;\n url: string;\n shutdown: () => Promise<void>;\n}\n\nfunction resolveStaticDir(): string {\n // In development: src/cli/ui/static/\n const devPath = join(__dirname, \"static\");\n if (existsSync(join(devPath, \"index.html\"))) {\n return devPath;\n }\n // When built with tsup (single-file bundle), __dirname is dist/\n // Static files are at dist/web/\n const distWebPath = join(__dirname, \"web\");\n if (existsSync(join(distWebPath, \"index.html\"))) {\n return distWebPath;\n }\n // Fallback: dist/../web (cli/web/)\n const siblingPath = join(__dirname, \"..\", \"web\");\n if (existsSync(join(siblingPath, \"index.html\"))) {\n return siblingPath;\n }\n throw new Error(\n `Cannot find static files. Checked:\\n ${devPath}\\n ${distWebPath}\\n ${siblingPath}`\n );\n}\n\nexport function parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nexport function sendJson(res: ServerResponse, statusCode: number, data: unknown): void {\n const body = JSON.stringify(data);\n res.writeHead(statusCode, {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(body),\n });\n res.end(body);\n}\n\nfunction sendHtml(res: ServerResponse, html: string): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(html),\n \"Cache-Control\": \"no-cache, no-store, must-revalidate\",\n \"Pragma\": \"no-cache\",\n \"Expires\": \"0\",\n });\n res.end(html);\n}\n\n// ── Authentication ──\n\nconst UI_PASSWORD = process.env.BEASTMODE_UI_PASSWORD || \"\";\nconst AUTH_COOKIE_NAME = \"bm_session\";\nconst AUTH_COOKIE_MAX_AGE = 86400; // 24 hours\n\nfunction signToken(password: string): string {\n return createHmac(\"sha256\", password).update(\"beastmode-authenticated\").digest(\"hex\");\n}\n\nfunction isAuthenticated(req: IncomingMessage): boolean {\n if (!UI_PASSWORD) return true; // No password set — auth disabled\n const cookie = req.headers.cookie || \"\";\n const match = cookie.split(\";\").find((c) => c.trim().startsWith(`${AUTH_COOKIE_NAME}=`));\n if (!match) return false;\n const token = match.split(\"=\")[1]?.trim();\n return token === signToken(UI_PASSWORD);\n}\n\nfunction isAuthExempt(method: string, url: string): boolean {\n if (url === \"/auth/login\" && method === \"POST\") return true;\n if (url === \"/auth/login\" && method === \"GET\") return true;\n if (url === \"/auth/logout\") return true;\n if (url.startsWith(\"/static/\")) return true; // CSS/images for login page\n if (url === \"/health\" && method === \"GET\") return true;\n if (url === \"/api/build-stamp\" && method === \"GET\") return true;\n if (url === \"/api/token-usage/recent\" && method === \"GET\") return true;\n return false;\n}\n\nfunction setSessionCookie(res: ServerResponse): void {\n const token = signToken(UI_PASSWORD);\n res.setHeader(\"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=${token}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${AUTH_COOKIE_MAX_AGE}`\n );\n}\n\nfunction clearSessionCookie(res: ServerResponse): void {\n res.setHeader(\"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`\n );\n}\n\nconst LOGIN_PAGE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>BeastMode — Login</title>\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/static/favicon.svg\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n background: #0a0a0a; color: #f0f0f0; display: flex; align-items: center;\n justify-content: center; min-height: 100vh; padding: 24px; }\n .login-card { background: #141414; border: 1px solid #2a2a2a; border-radius: 12px;\n padding: 36px 40px 32px; width: 100%; max-width: 400px; text-align: center;\n box-shadow: 0 8px 32px rgba(0,0,0,0.4); }\n .login-logo { width: 260px; height: auto; display: block; margin: 0 auto 20px; }\n .login-logo .body { fill: #f0f0f0; }\n .login-logo .win { fill: #141414; }\n .login-logo .wm { fill: #f0f0f0; }\n .login-logo .sub { fill: #666; }\n .login-logo .amber { fill: #F5A623; }\n .login-logo .amber-s { stroke: #F5A623; fill: none; }\n .login-card p { font-size: 13px; color: #999; margin-bottom: 24px; letter-spacing: 0.3px; }\n .login-card input { width: 100%; padding: 12px 16px; background: #1a1a1a;\n border: 1px solid #2a2a2a; border-radius: 8px; color: #f0f0f0;\n font-size: 15px; outline: none; margin-bottom: 14px;\n transition: border-color 0.15s ease; font-family: inherit; }\n .login-card input:focus { border-color: #F5A623; box-shadow: 0 0 0 3px rgba(245,166,35,0.15); }\n .login-card input::placeholder { color: #666; }\n .login-card button { width: 100%; padding: 12px; background: #F5A623; color: #1a1a1a;\n border: none; border-radius: 8px; font-size: 15px; font-weight: 600;\n cursor: pointer; transition: background 0.15s ease; font-family: inherit; }\n .login-card button:hover { background: #E5961A; }\n .error { color: #f87171; font-size: 13px; margin-bottom: 12px; display: none; }\n .attribution { margin-top: 18px; font-size: 11px; color: #666; letter-spacing: 0.3px; }\n .attribution a { color: #999; text-decoration: none; transition: color 0.15s ease; }\n .attribution a:hover { color: #F5A623; }\n </style>\n</head>\n<body>\n <div class=\"login-card\">\n <svg class=\"login-logo\" viewBox=\"0 0 400 320\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"BeastMode — Dark Factory\">\n <g transform=\"translate(200,130)\">\n <rect class=\"body\" x=\"-52\" y=\"8\" width=\"62\" height=\"56\" rx=\"2\"/>\n <rect class=\"body\" x=\"12\" y=\"-12\" width=\"44\" height=\"76\" rx=\"2\"/>\n <rect class=\"body\" x=\"20\" y=\"-50\" width=\"13\" height=\"42\" rx=\"1.5\"/>\n <rect class=\"body\" x=\"39\" y=\"-32\" width=\"10\" height=\"24\" rx=\"1.5\"/>\n <rect class=\"win\" x=\"-43\" y=\"18\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-28\" y=\"18\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-43\" y=\"34\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-28\" y=\"34\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"20\" y=\"0\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"38\" y=\"0\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"20\" y=\"18\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"38\" y=\"18\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"body\" x=\"-58\" y=\"64\" width=\"120\" height=\"3\" rx=\"1.5\"/>\n <line class=\"amber-s\" x1=\"26\" y1=\"-54\" x2=\"26\" y2=\"-98\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"26,-98 17,-82 35,-82\"/>\n <line class=\"amber-s\" x1=\"14\" y1=\"-56\" x2=\"5\" y2=\"-80\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"5,-80 0,-70 10,-70\"/>\n <line class=\"amber-s\" x1=\"40\" y1=\"-46\" x2=\"48\" y2=\"-72\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"48,-72 43,-62 53,-62\"/>\n <circle class=\"amber\" cx=\"26\" cy=\"-108\" r=\"3\"/>\n <circle class=\"amber\" cx=\"0\" cy=\"-86\" r=\"1.8\"/>\n <circle class=\"amber\" cx=\"53\" cy=\"-78\" r=\"1.8\"/>\n <circle class=\"amber\" cx=\"13\" cy=\"-96\" r=\"1.5\"/>\n <circle class=\"amber\" cx=\"42\" cy=\"-88\" r=\"1.3\"/>\n </g>\n <text class=\"wm\" x=\"200\" y=\"255\" text-anchor=\"middle\" font-family=\"system-ui,-apple-system,sans-serif\" font-size=\"30\" font-weight=\"500\" letter-spacing=\"7\">BEASTMODE</text>\n <text class=\"sub\" x=\"200\" y=\"280\" text-anchor=\"middle\" font-family=\"system-ui,-apple-system,sans-serif\" font-size=\"11\" letter-spacing=\"4\">DARK FACTORY</text>\n </svg>\n <p>Enter password to access the board</p>\n <div class=\"error\" id=\"error\">Invalid password</div>\n <form id=\"form\">\n <input type=\"password\" name=\"password\" placeholder=\"Password\" autofocus />\n <button type=\"submit\">Login</button>\n </form>\n <div class=\"attribution\">by <a href=\"https://develeap.com\" target=\"_blank\" rel=\"noopener noreferrer\">develeap</a></div>\n </div>\n <script>\n document.getElementById('form').addEventListener('submit', async (e) => {\n e.preventDefault();\n const password = e.target.password.value;\n const res = await fetch('/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ password }),\n });\n if (res.ok) {\n window.location.href = '/';\n } else {\n const err = document.getElementById('error');\n err.style.display = 'block';\n e.target.password.value = '';\n e.target.password.focus();\n }\n });\n </script>\n</body>\n</html>`;\n\nexport async function findAvailablePort(start: number): Promise<number> {\n for (let port = start; port < start + 100; port++) {\n const available = await new Promise<boolean>((resolve) => {\n const testServer = createServer();\n testServer.once(\"error\", () => resolve(false));\n testServer.listen(port, \"127.0.0.1\", () => {\n testServer.close(() => resolve(true));\n });\n });\n if (available) return port;\n }\n throw new Error(`No available port found in range ${start}-${start + 99}`);\n}\n\nexport async function startServer(options: ServerOptions = {}): Promise<UIServer> {\n const port = await findAvailablePort(options.port || 7669);\n const mode = options.mode || \"init\";\n const initRoutes = getRoutes();\n const boardRoutes: BoardRoute[] = options.factoryPath\n ? getBoardRoutes(options.factoryPath)\n : [];\n\n let staticDir: string;\n\n try {\n staticDir = resolveStaticDir();\n } catch {\n staticDir = \"\";\n }\n\n // Re-read the HTML files on EVERY request so that docker cp / rsync /\n // file-watcher updates take effect without a container restart. The\n // old behaviour (readFileSync once at startup, cache in memory) was a\n // debugging footgun — hot-copying a new board.html into the running\n // container silently did nothing because this process still served the\n // cached string. Observed 2026-04-14 during Story 1 / Story 3 recovery.\n //\n // Per-request fs.readFileSync on a local disk is ~200µs, fully\n // acceptable for a local dev UI that handles maybe 1 request/second.\n // For production deployments serving high traffic, add an ETag /\n // mtime-based cache — out of scope here. See\n // docs/zero-to-productive-readiness.md Gap 10.\n function loadIndexHtml(): string {\n const fallback = \"<html><body><h1>BeastMode Init Wizard</h1><p>Static files not found.</p></body></html>\";\n if (!staticDir) return fallback;\n try {\n const indexPath = join(staticDir, \"index.html\");\n if (!existsSync(indexPath)) return fallback;\n return readFileSync(indexPath, \"utf-8\");\n } catch {\n return fallback;\n }\n }\n\n // Returns the board HTML, or null if the artifact is missing/unreadable.\n // Callers must distinguish these cases so the HTTP response can signal\n // \"deploy broken\" (503 + header) instead of \"feature missing\" (200 + stub).\n // Without this split, the verifier treats a broken deploy as a code bug\n // and fail-fast bounces the task to spec review. See #39/#45 on\n // 2026-04-18.\n function loadBoardHtml(): string | null {\n try {\n const dir = staticDir || resolveStaticDir();\n const boardPath = join(dir, \"board.html\");\n if (!existsSync(boardPath)) return null;\n return readFileSync(boardPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n // Chat manager for Claude Code integration\n let chatManager: ChatManager | null = null;\n if (options.factoryPath) {\n chatManager = createChatManager();\n }\n\n let inactivityTimer: ReturnType<typeof setTimeout>;\n let shutdownResolve: (() => void) | null = null;\n\n function resetInactivityTimer(): void {\n clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n shutdown();\n }, INACTIVITY_TIMEOUT_MS);\n }\n\n function matchInitRoute(method: string, url: string): Route | undefined {\n return initRoutes.find((r) => r.method === method && r.path === url);\n }\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n resetInactivityTimer();\n\n const method = req.method || \"GET\";\n const rawUrl = req.url || \"/\";\n const queryStart = rawUrl.indexOf(\"?\");\n const url = queryStart === -1 ? rawUrl : rawUrl.slice(0, queryStart);\n const rawQuery = queryStart === -1 ? \"\" : rawUrl.slice(queryStart + 1);\n const query: Record<string, string> = {};\n if (rawQuery) {\n for (const part of rawQuery.split(\"&\")) {\n if (!part) continue;\n const eq = part.indexOf(\"=\");\n if (eq === -1) {\n query[decodeURIComponent(part)] = \"\";\n } else {\n query[decodeURIComponent(part.slice(0, eq))] = decodeURIComponent(part.slice(eq + 1));\n }\n }\n }\n\n // ── Auth gate ──\n if (UI_PASSWORD && !isAuthExempt(method, url) && !isAuthenticated(req)) {\n res.writeHead(302, { Location: \"/auth/login\" });\n res.end();\n return;\n }\n\n // Auth routes\n if (url === \"/auth/login\" && method === \"GET\") {\n if (!UI_PASSWORD || isAuthenticated(req)) {\n res.writeHead(302, { Location: \"/\" });\n res.end();\n } else {\n sendHtml(res, LOGIN_PAGE);\n }\n return;\n }\n if (url === \"/auth/login\" && method === \"POST\") {\n try {\n const body = await parseBody(req) as { password?: string };\n if (body.password && body.password === UI_PASSWORD) {\n setSessionCookie(res);\n sendJson(res, 200, { success: true });\n } else {\n sendJson(res, 401, { error: \"Invalid password\" });\n }\n } catch {\n sendJson(res, 400, { error: \"Bad request\" });\n }\n return;\n }\n if (url === \"/auth/logout\") {\n clearSessionCookie(res);\n res.writeHead(302, { Location: \"/auth/login\" });\n res.end();\n return;\n }\n\n // Health check endpoint (no auth required)\n if (method === \"GET\" && url === \"/health\") {\n sendJson(res, 200, { status: \"ok\", uptime: process.uptime() });\n return;\n }\n\n // Build stamp endpoint — deploy-truth anchor.\n //\n // Returns the build marker the verifier uses to confirm it is testing the\n // commit it was asked to test. Without this check, a stale slot-sync copy\n // or transient deploy glitch looks like a 0% feature failure instead of\n // the infra failure it actually is — that confusion burned stories\n // #39, #44, #45 on 2026-04-18. See also:\n // daemon/beastmode_daemon/pipeline/verify_production.py pre-flight.\n // Recent chat token usage (Story 3 — FR-5). Returns the in-memory\n // ring buffer of token records captured from runViaApi / runViaCli.\n // Empty array when no chat messages have been sent since boot.\n if (method === \"GET\" && url === \"/api/token-usage/recent\") {\n sendJson(res, 200, getRecentTokenUsage());\n return;\n }\n\n if (method === \"GET\" && url === \"/api/build-stamp\") {\n let stamp = \"unknown\";\n let commit_sha: string | null = null;\n try {\n const dir = staticDir || resolveStaticDir();\n const stampPath = join(dir, \"build-stamp.txt\");\n if (existsSync(stampPath)) {\n stamp = readFileSync(stampPath, \"utf-8\").trim();\n }\n const commitPath = join(dir, \"build-commit.txt\");\n if (existsSync(commitPath)) {\n commit_sha = readFileSync(commitPath, \"utf-8\").trim() || null;\n }\n } catch {\n /* fallback — leave as unknown / null */\n }\n sendJson(res, 200, { stamp, commit_sha, service: \"ui\" });\n return;\n }\n\n // Board API routes (pattern matching with :params)\n if (boardRoutes.length > 0) {\n const boardMatch = matchBoardRoute(boardRoutes, method, url);\n if (boardMatch) {\n try {\n let body: unknown = undefined;\n if (method === \"POST\" || method === \"PATCH\") {\n body = await parseBody(req);\n }\n const result = await boardMatch.route.handler(body, boardMatch.params, query);\n // Binary responses (attachment downloads etc. — Gap 8a)\n // return a BinaryResponse sentinel that we serialize as\n // raw bytes with the original Content-Type. Everything\n // else goes through the JSON encoder.\n if (result instanceof BinaryResponse) {\n const headers: Record<string, string | number> = {\n \"Content-Type\": result.contentType,\n \"Content-Length\": result.body.length,\n };\n if (result.filename) {\n headers[\"Content-Disposition\"] =\n `inline; filename=\"${result.filename.replace(/\"/g, \"\")}\"`;\n }\n res.writeHead(200, headers);\n res.end(result.body);\n } else {\n sendJson(res, 200, result);\n }\n } catch (err) {\n if (err instanceof HttpError) {\n sendJson(res, err.statusCode, err.body);\n } else {\n const message = err instanceof Error ? err.message : \"Internal server error\";\n sendJson(res, 500, { error: message });\n }\n }\n return;\n }\n }\n\n // Init API routes (exact match)\n const initRoute = matchInitRoute(method, url);\n if (initRoute) {\n try {\n let body: unknown = undefined;\n if (method === \"POST\") {\n body = await parseBody(req);\n }\n const result = await initRoute.handler(body);\n\n // Check if scaffold was called — signal shutdown after delay (init mode only)\n if (\n mode === \"init\" &&\n url === \"/api/scaffold\" &&\n (result as Record<string, unknown>).success\n ) {\n setTimeout(() => shutdown(), 3000);\n }\n\n sendJson(res, 200, result);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Internal server error\";\n sendJson(res, 500, { error: message });\n }\n return;\n }\n\n // Chat API routes\n if (chatManager && options.factoryPath) {\n if (method === \"POST\" && url === \"/api/chat/start\") {\n const session = chatManager.startSession(options.factoryPath);\n sendJson(res, 200, { sessionId: session.id });\n return;\n }\n if (method === \"POST\" && url === \"/api/chat/stop\") {\n try {\n const body = await parseBody(req) as { sessionId?: string };\n if (body.sessionId) {\n chatManager.stopSession(body.sessionId);\n }\n } catch { /* ignore */ }\n sendJson(res, 200, { success: true });\n return;\n }\n }\n\n // Serve static assets (images)\n if (method === \"GET\" && url.startsWith(\"/static/\")) {\n const filename = url.slice(\"/static/\".length);\n const filePath = staticDir ? join(staticDir, filename) : \"\";\n if (filePath && existsSync(filePath)) {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const mimeTypes: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n svg: \"image/svg+xml\",\n ico: \"image/x-icon\",\n };\n const contentType = mimeTypes[ext || \"\"] || \"application/octet-stream\";\n const content = readFileSync(filePath);\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": content.length.toString(),\n \"Cache-Control\": \"public, max-age=60, must-revalidate\",\n });\n res.end(content);\n return;\n }\n }\n\n // Static file serving\n if (method === \"GET\") {\n // Board page\n if (url === \"/board\" || url === \"/board.html\") {\n // Re-read board.html on every request so docker cp and live\n // file edits take effect without a container restart. See\n // loadBoardHtml() above + docs/zero-to-productive-readiness.md\n // Gap 10.\n let html = loadBoardHtml();\n if (html === null) {\n const body = \"<html><body><h1>BeastMode Board</h1><p>Artifact missing — deploy pipeline produced an unreadable board.html. This is an infrastructure failure, not a feature bug.</p></body></html>\";\n res.writeHead(503, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(body),\n \"Cache-Control\": \"no-store\",\n \"X-Beastmode-Artifact-Status\": \"missing\",\n });\n res.end(body);\n return;\n }\n if (options.factoryPath || options.factoryName) {\n const boardData = JSON.stringify({\n factoryPath: options.factoryPath || \"\",\n factoryName: options.factoryName || \"\",\n });\n html = html.replace(\n \"<!--BOARD_DATA-->\",\n `<script>window.__BOARD_DATA__ = ${boardData};</script>`\n );\n }\n sendHtml(res, html);\n return;\n }\n\n // Init wizard (index.html)\n if (url === \"/\" || url === \"/index.html\") {\n if (mode === \"board\") {\n // In board mode, redirect root to /board\n res.writeHead(302, { Location: \"/board\" });\n res.end();\n return;\n }\n // Same rationale as loadBoardHtml — re-read on every request.\n let html = loadIndexHtml();\n if (options.factoryName || options.projectPath) {\n const initData = JSON.stringify({\n factoryName: options.factoryName || \"\",\n projectPath: options.projectPath || \"\",\n });\n html = html.replace(\n \"<!--INIT_DATA-->\",\n `<script>window.__INIT_DATA__ = ${initData};</script>`\n );\n }\n sendHtml(res, html);\n return;\n }\n }\n\n // Gap 8 — transparent fallback proxy for unmatched /api/* routes.\n // Reaches here only if the URL didn't match any explicit board route\n // (with path rewrites), any init route, or any chat route. Forwards\n // the request unchanged to the board service so new backend routes\n // become reachable from the UI without requiring a manual allowlist\n // entry. Preserves the board's status code and content-type.\n if (\n url.startsWith(\"/api/\") &&\n boardRoutes.length > 0 &&\n options.factoryPath &&\n (method === \"GET\" || method === \"POST\" || method === \"PATCH\" || method === \"DELETE\")\n ) {\n try {\n const body =\n method === \"POST\" || method === \"PATCH\"\n ? await parseBody(req)\n : undefined;\n const proxied = await transparentProxyToBoard(\n getBoardUrl(options.factoryPath),\n method,\n url.split(\"?\")[0],\n body,\n query,\n );\n res.writeHead(proxied.statusCode, { \"Content-Type\": proxied.contentType });\n res.end(proxied.body);\n return;\n } catch {\n // Fall through to 404 if the board is unreachable.\n }\n }\n\n // 404\n sendJson(res, 404, { error: \"Not found\" });\n });\n\n // Handle WebSocket upgrades for chat AND board real-time updates.\n // The board.html client opens ws://localhost:8420/ws for real-time\n // task updates (cost events, status changes). The Python board\n // server at board:8080 publishes these via its ConnectionManager;\n // we proxy them here so browsers on :8420 can subscribe. Without\n // this proxy, the client reconnects every 3s hitting 404 forever —\n // observed by Agent C on 2026-04-19. Chat uses /ws/chat, a separate\n // path owned by chatManager.\n server.on(\"upgrade\", (req, socket, head) => {\n const url = (req.url || \"\").split(\"?\")[0];\n if (url === \"/ws/chat\") {\n if (!chatManager) {\n socket.write(\"HTTP/1.1 503 Service Unavailable\\r\\n\\r\\n\");\n socket.end();\n return;\n }\n // Auto-create a session if none exists so the WebSocket endpoint\n // is reachable without a prior POST /api/chat/start (required for\n // browser-based verification scenarios that connect directly).\n if (options.factoryPath && chatManager.sessions.size === 0) {\n chatManager.startSession(options.factoryPath);\n }\n chatManager.handleUpgrade(req, socket, head);\n return;\n }\n if (url === \"/ws\") {\n // Proxy to board server's /ws. Relay bidirectionally and close\n // cleanly when either end disconnects.\n const factoryDir = options.factoryPath || process.cwd();\n const boardUrl = getBoardUrl(factoryDir);\n // Convert http://board:8080 → ws://board:8080/ws (handles https→wss too).\n const wsBoardUrl = boardUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n proxyBoardWebSocket(req, socket, head, wsBoardUrl);\n return;\n }\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.end();\n });\n\n async function shutdown(): Promise<void> {\n clearTimeout(inactivityTimer);\n if (chatManager) {\n chatManager.shutdown();\n }\n return new Promise<void>((resolve) => {\n server.close(() => {\n if (shutdownResolve) shutdownResolve();\n resolve();\n });\n // Force close after 2 seconds\n setTimeout(() => {\n if (shutdownResolve) shutdownResolve();\n resolve();\n }, 2000);\n });\n }\n\n return new Promise<UIServer>((resolve, reject) => {\n server.once(\"error\", reject);\n const host = options.host || \"127.0.0.1\";\n server.listen(port, host, () => {\n resetInactivityTimer();\n resolve({\n server,\n port,\n url: `http://${host === \"0.0.0.0\" ? \"localhost\" : host}:${port}`,\n shutdown,\n });\n });\n });\n}\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, readdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { info, error, header } from \"../utils/display.js\";\n\nexport const boardCommand = new Command(\"board\")\n .description(\"Launch the BeastMode Board web UI\")\n .option(\"--port <number>\", \"Port to serve on\", \"7669\")\n .option(\"--host <host>\", \"Host to bind to (use 0.0.0.0 for external access)\", \"127.0.0.1\")\n .action(async (opts) => {\n try {\n await runBoard(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nboardCommand\n .command(\"set-status <item_id> <status>\")\n .description(\n \"Safely change a board item's status via the board HTTP API (never sqlite3 against the live DB — Gap 24)\",\n )\n .option(\"--project <name>\", \"Project/board name (defaults to the factory's only project, or errors if ambiguous)\")\n .option(\"--board-url <url>\", \"Override board HTTP URL (default: use running board container via docker exec)\")\n .action(async (itemId: string, status: string, opts: { project?: string; boardUrl?: string }) => {\n try {\n await setItemStatus(itemId, status, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface BoardOptions {\n port: string;\n host: string;\n}\n\n/**\n * Walk up from cwd to find the nearest .beastmode/ directory.\n * Returns the factory directory path or null if not found.\n */\nexport function findFactoryDir(startDir?: string): string | null {\n let dir = startDir || process.cwd();\n const root = resolve(\"/\");\n\n while (dir !== root) {\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n\n // Check root too\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n\n return null;\n}\n\nfunction inferProjectName(factoryDir: string): string | null {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return null;\n const files = readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"));\n if (files.length === 1) return files[0].replace(/\\.json$/, \"\");\n return null;\n}\n\nfunction tryExecSync(cmd: string, timeoutMs = 15000): string | null {\n try {\n return execSync(cmd, { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"pipe\"], timeout: timeoutMs }).trim();\n } catch {\n return null;\n }\n}\n\nexport async function setItemStatus(\n itemId: string,\n status: string,\n opts: { project?: string; boardUrl?: string },\n): Promise<void> {\n if (!itemId || !/^\\d+$/.test(itemId)) {\n throw new Error(`Invalid item_id: ${itemId} (expected numeric id)`);\n }\n const trimmedStatus = status.trim();\n if (!trimmedStatus) {\n throw new Error(\"status cannot be empty\");\n }\n\n let project = opts.project;\n if (!project) {\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\"No .beastmode factory found in cwd tree. Pass --project <name> explicitly.\");\n }\n const inferred = inferProjectName(factoryDir);\n if (!inferred) {\n throw new Error(\n \"Could not determine project name from factory (0 or >1 projects configured). Pass --project <name>.\",\n );\n }\n project = inferred;\n }\n\n const payload = JSON.stringify({ status: trimmedStatus });\n\n if (opts.boardUrl) {\n const url = `${opts.boardUrl.replace(/\\/+$/, \"\")}/api/items/${itemId}?board=${encodeURIComponent(project)}`;\n const cmd = `curl -sS -X PATCH '${url}' -H 'Content-Type: application/json' -d '${payload.replace(/'/g, \"'\\\\''\")}'`;\n const out = tryExecSync(cmd);\n if (!out) throw new Error(`curl failed hitting ${url}`);\n info(out);\n return;\n }\n\n // Prefer the daemon container — it has curl AND is on the same docker\n // network as the board. The board container itself only ships python3,\n // no curl/wget, so we can't exec curl there directly.\n const container =\n tryExecSync(`docker ps --filter 'label=com.docker.compose.service=daemon' --format '{{.Names}}' | head -n1`) ||\n tryExecSync(`docker ps --filter 'label=com.docker.compose.service=ui' --format '{{.Names}}' | head -n1`);\n if (!container) {\n throw new Error(\n \"No running daemon or ui container found. Start the factory with `docker compose up -d`, or pass --board-url.\",\n );\n }\n\n const escapedPayload = payload.replace(/'/g, \"'\\\\''\");\n const url = `http://board:8080/api/items/${itemId}?board=${encodeURIComponent(project)}`;\n const cmd = `docker exec ${container} curl -sS -X PATCH '${url}' -H 'Content-Type: application/json' -d '${escapedPayload}'`;\n const out = tryExecSync(cmd);\n if (!out) {\n throw new Error(`docker exec curl failed hitting ${url} via ${container}`);\n }\n\n // Board returns 200 + ItemResponse on success, 404/400 with {\"detail\": \"...\"} on failure.\n try {\n const parsed = JSON.parse(out) as { detail?: string; id?: string; status?: string };\n if (parsed.detail) {\n throw new Error(`Board rejected update: ${parsed.detail}`);\n }\n if (parsed.id && parsed.status) {\n info(`Item ${parsed.id} → ${parsed.status} (project=${project})`);\n return;\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Board rejected update:\")) throw e;\n }\n info(out);\n}\n\nasync function runBoard(opts: BoardOptions): Promise<void> {\n let factoryDir = findFactoryDir();\n if (!factoryDir) {\n // Auto-create a stub factory in cwd so the board works out-of-the-box\n // (primarily for Docker Compose and ad-hoc usage). Users can run\n // `beastmode init` later for a fully-configured factory.\n factoryDir = process.cwd();\n const bmDir = join(factoryDir, \".beastmode\");\n if (!existsSync(bmDir)) {\n mkdirSync(bmDir, { recursive: true });\n }\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n writeFileSync(\n factoryJsonPath,\n JSON.stringify({ factory_name: \"BeastMode\", created_at: new Date().toISOString() }, null, 2),\n \"utf-8\"\n );\n info(\"No factory found — created minimal stub at .beastmode/factory.json\");\n }\n }\n\n // Read factory name\n const factoryJsonPath = join(factoryDir, \".beastmode\", \"factory.json\");\n const factoryJson = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const factoryName = factoryJson.factory_name || \"BeastMode Factory\";\n\n header(`BeastMode Board — ${factoryName}`);\n\n const { startServer } = await import(\"../ui/server.js\");\n const port = parseInt(opts.port, 10) || 7669;\n\n const uiServer = await startServer({\n port,\n host: opts.host,\n factoryName,\n factoryPath: factoryDir,\n mode: \"board\",\n });\n\n info(`Board running at ${uiServer.url}/board`);\n info(\"Press Ctrl+C to stop.\\n\");\n\n // Open browser (skip in Docker / CI — no display)\n const skipOpen = process.env.BEASTMODE_NO_OPEN === \"1\" || !!process.env.DOCKER_CONTAINER;\n if (!skipOpen) {\n try {\n const open = (await import(\"open\")).default;\n await open(`${uiServer.url}/board`);\n } catch {\n info(`Open ${uiServer.url}/board in your browser.`);\n }\n } else {\n info(`Open ${uiServer.url}/board in your browser.`);\n }\n\n // Keep process alive until shutdown\n await new Promise<void>((resolvePromise) => {\n uiServer.server.on(\"close\", resolvePromise);\n process.on(\"SIGINT\", async () => {\n info(\"\\nShutting down board server...\");\n await uiServer.shutdown();\n resolvePromise();\n });\n });\n}\n","import { Command } from \"commander\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { writeFileSync, readFileSync, chmodSync, mkdirSync, existsSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\nimport { header, success, warn, info, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\n\ninterface SyncOptions {\n restart?: boolean;\n install?: boolean;\n uninstall?: boolean;\n status?: boolean;\n interval?: string;\n}\n\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\nconst SYSTEMD_UNIT_NAME = \"beastmode-claude-creds\";\nconst DEFAULT_INTERVAL_SECONDS = 1800; // 30 minutes\n\nfunction systemdUserDir(): string {\n return join(homedir(), \".config\", \"systemd\", \"user\");\n}\n\nfunction systemdServicePath(): string {\n return join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.service`);\n}\n\nfunction systemdTimerPath(): string {\n return join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.timer`);\n}\n\nfunction linuxCredsPath(): string {\n return join(homedir(), \".claude\", \".credentials.json\");\n}\n\nfunction plistPath(): string {\n return join(homedir(), \"Library\", \"LaunchAgents\", `${LAUNCH_AGENT_LABEL}.plist`);\n}\n\nfunction agentLogPath(): string {\n return join(homedir(), \".beastmode\", \"logs\", \"sync-claude-creds.log\");\n}\n\n/** Read Claude Code OAuth token from macOS Keychain.\n *\n * Returns ``null`` instead of exiting when the token is missing, so\n * callers (like ``beastmode init``) can decide whether the miss is\n * fatal or a best-effort warning. The CLI ``sync-claude-creds``\n * entry still treats a miss as fatal via ``readKeychainTokenOrExit``.\n */\nexport function readKeychainTokenSafe(): string | null {\n try {\n return execSync(\n `security find-generic-password -s \"Claude Code-credentials\" -w`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }\n ).trim();\n } catch {\n return null;\n }\n}\n\nfunction readKeychainToken(): string {\n const token = readKeychainTokenSafe();\n if (token === null) {\n error(\"Could not read Claude Code credentials from Keychain.\");\n info(\"Fix: run `claude login` first, then re-run this command.\");\n process.exit(1);\n }\n return token;\n}\n\n/** Write token JSON to ~/.claude/.credentials.json (mode 0600).\n *\n * Throws ``Error`` on validation failure instead of ``process.exit``\n * so library callers (``beastmode init`` → ``syncClaudeCredsOnce``)\n * can surface the problem as a warning without terminating. The CLI\n * entry catches those throws in ``runSyncClaudeCreds``.\n */\nfunction writeCredentialsFile(rawJson: string): string {\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawJson);\n } catch {\n throw new Error(\"Keychain entry is not valid JSON. Fix: run `claude login` again to reset the credential.\");\n }\n\n const oauth = (parsed as { claudeAiOauth?: { accessToken?: string; expiresAt?: number } })\n .claudeAiOauth;\n if (!oauth?.accessToken) {\n throw new Error(\"Keychain entry missing claudeAiOauth.accessToken. Fix: run `claude login` again to reset the credential.\");\n }\n\n const claudeDir = join(homedir(), \".claude\");\n if (!existsSync(claudeDir)) mkdirSync(claudeDir, { recursive: true });\n const credsPath = join(claudeDir, \".credentials.json\");\n writeFileSync(credsPath, rawJson + \"\\n\", \"utf-8\");\n chmodSync(credsPath, 0o600);\n\n // Token expiry diagnostic\n if (oauth.expiresAt) {\n const hoursLeft = Math.round((oauth.expiresAt - Date.now()) / 3_600_000);\n if (hoursLeft < 0) {\n warn(`Token already expired ${Math.abs(hoursLeft)}h ago — run \\`claude login\\` to refresh.`);\n } else if (hoursLeft < 2) {\n warn(`Token expires in ${hoursLeft}h — background agent will re-sync after host refreshes it.`);\n }\n }\n return credsPath;\n}\n\n/** Path to the urgency marker file the daemon's broker creates when\n * it wants the host to sync credentials NOW (without waiting for the\n * next interval tick). The launchd plist watches this path via\n * ``WatchPaths`` so a `touch` from inside the container fires the\n * sync within ~2-5 seconds. */\nfunction urgencyMarkerHostPath(factoryDir: string): string {\n return join(factoryDir, \"daemon\", \"logs\", \".cred-refresh-needed\");\n}\n\n/** Remove the urgency marker after a successful sync.\n *\n * Best-effort: if the file is missing (the common case on a normal\n * scheduled tick) this is a no-op. ENOENT and other errors are\n * swallowed because failing here would mask the success of the sync\n * itself. */\nfunction removeUrgencyMarker(factoryDir: string | undefined): void {\n if (!factoryDir) return;\n const markerPath = urgencyMarkerHostPath(factoryDir);\n try {\n unlinkSync(markerPath);\n } catch {\n // marker not present — fine, this is the normal interval-tick case\n }\n}\n\n/** Build the launchd plist XML. Uses the current node binary and CLI entry.\n *\n * When ``factoryDir`` is provided, the plist gains a ``WatchPaths`` entry\n * pointing at the daemon's urgency-marker file. launchd then fires the\n * agent as soon as the daemon's broker creates that file (instead of\n * waiting for the next ``StartInterval`` tick), collapsing the\n * worst-case credential-refresh wait from ~30 minutes to ~5 seconds.\n *\n * When ``factoryDir`` is omitted, the plist falls back to interval-only\n * behavior — backward compatible with installs that pre-date this\n * feature. */\nfunction buildPlist(intervalSeconds: number, factoryDir?: string): string {\n const nodePath = process.execPath;\n const cliEntry = process.argv[1]; // path to the running cli (dist/index.js or similar)\n const logPath = agentLogPath();\n const keychainPath = join(homedir(), \"Library\", \"Keychains\", \"login.keychain-db\");\n\n const watchPaths: string[] = [keychainPath];\n if (factoryDir) {\n watchPaths.push(urgencyMarkerHostPath(factoryDir));\n }\n const watchPathsXml = ` <key>WatchPaths</key>\n <array>\n${watchPaths.map((p) => ` <string>${p}</string>`).join(\"\\n\")}\n </array>\n`;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LAUNCH_AGENT_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${cliEntry}</string>\n <string>sync-claude-creds</string>\n </array>\n <key>StartInterval</key>\n <integer>${intervalSeconds}</integer>\n <key>RunAtLoad</key>\n <true/>\n${watchPathsXml} <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\n/** Install the credential-sync LaunchAgent.\n *\n * ``throwOnError`` flips the failure behavior:\n * - CLI entry (``sync-claude-creds --install``) passes ``false`` and\n * treats launchctl errors as a hard ``process.exit(1)``.\n * - ``beastmode init`` passes ``true`` so a flaky install (e.g. user\n * declined the launchd prompt) becomes a warning instead of a\n * blown-up scaffold.\n */\nexport function installAgent(\n intervalSeconds: number,\n {\n throwOnError = false,\n factoryDir,\n }: { throwOnError?: boolean; factoryDir?: string } = {},\n): void {\n const plist = plistPath();\n const logPath = agentLogPath();\n\n mkdirSync(join(homedir(), \"Library\", \"LaunchAgents\"), { recursive: true });\n mkdirSync(join(homedir(), \".beastmode\", \"logs\"), { recursive: true });\n\n // Unload existing agent if present (idempotent reinstall)\n const uid = process.getuid?.();\n if (existsSync(plist)) {\n spawnSync(\"launchctl\", [\"bootout\", `gui/${uid}`, plist], { stdio: \"pipe\" });\n }\n\n // Resolve factory dir for WatchPaths if the caller didn't pass one\n // explicitly. When run from a beastmode factory directory this finds\n // the root via the .beastmode marker; when run elsewhere we fall\n // back to interval-only behavior.\n const resolvedFactory = factoryDir ?? findFactoryDir() ?? undefined;\n writeFileSync(plist, buildPlist(intervalSeconds, resolvedFactory), \"utf-8\");\n // Touch log so StandardOutPath exists immediately (launchd is picky)\n writeFileSync(logPath, \"\", { flag: \"a\" });\n\n const result = spawnSync(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plist], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n if (result.status !== 0) {\n const msg = `launchctl bootstrap failed: ${result.stderr || result.stdout}`;\n if (throwOnError) {\n throw new Error(msg);\n }\n error(msg);\n info(`Plist written to: ${plist}`);\n info(`Try manually: launchctl bootstrap gui/${uid} ${plist}`);\n process.exit(1);\n }\n\n success(`LaunchAgent installed: ${LAUNCH_AGENT_LABEL}`);\n info(` Plist: ${plist}`);\n info(` Interval: every ${Math.round(intervalSeconds / 60)} minutes`);\n info(` Logs: ${logPath}`);\n info(` Triggers: load + every ${Math.round(intervalSeconds / 60)}min + Keychain change`);\n console.log();\n info(\"The agent also runs once right now (RunAtLoad=true) — credentials synced.\");\n}\n\n/** Export the writer so callers outside this module can persist a\n * fresh Keychain token on demand. Used by ``beastmode init`` to seed\n * ``~/.claude/.credentials.json`` at scaffold time so the first\n * ``docker compose up`` doesn't crash on \"Claude CLI Not Logged In\".\n */\nexport function syncClaudeCredsOnce(): { path: string } | { error: string } {\n const token = readKeychainTokenSafe();\n if (token === null) {\n return { error: \"Could not read Claude Code credentials from Keychain — run `claude login` first.\" };\n }\n try {\n const path = writeCredentialsFile(token);\n return { path };\n } catch (e) {\n return { error: `Failed to write credentials: ${e instanceof Error ? e.message : String(e)}` };\n }\n}\n\nfunction uninstallAgent(): void {\n const plist = plistPath();\n const uid = process.getuid?.();\n\n if (!existsSync(plist)) {\n info(\"No LaunchAgent installed — nothing to remove.\");\n return;\n }\n\n const result = spawnSync(\"launchctl\", [\"bootout\", `gui/${uid}`, plist], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n // bootout returns non-zero if not loaded, but that's fine — we're removing it anyway\n if (result.status !== 0 && !(result.stderr || \"\").includes(\"Could not find\")) {\n warn(`launchctl bootout returned: ${result.stderr || result.stdout}`);\n }\n\n try {\n unlinkSync(plist);\n } catch {\n // already gone\n }\n\n success(`LaunchAgent removed: ${LAUNCH_AGENT_LABEL}`);\n}\n\nfunction showStatus(): void {\n const plist = plistPath();\n const uid = process.getuid?.();\n\n if (!existsSync(plist)) {\n info(\"LaunchAgent not installed.\");\n info(\"Install with: beastmode sync-claude-creds --install\");\n return;\n }\n\n const result = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" }\n );\n\n if (result.status === 0) {\n success(`LaunchAgent loaded: ${LAUNCH_AGENT_LABEL}`);\n // Extract the important bits\n const stateMatch = result.stdout.match(/state = (\\S+)/);\n const lastExitMatch = result.stdout.match(/last exit code = (\\S+)/);\n if (stateMatch) info(` State: ${stateMatch[1]}`);\n if (lastExitMatch) info(` Last exit code: ${lastExitMatch[1]}`);\n info(` Plist: ${plist}`);\n info(` Logs: ${agentLogPath()}`);\n } else {\n warn(`Plist exists but agent not loaded. Re-install with: beastmode sync-claude-creds --install`);\n }\n}\n\n// ── Linux support ────────────────────────────────────────────────────\n//\n// On Linux, the Claude CLI writes credentials directly to\n// ~/.claude/.credentials.json — no Keychain extraction needed. The\n// Linux sync command becomes a *validator + refresh trigger*:\n// - Read the credentials file\n// - Validate JSON shape (claudeAiOauth.accessToken)\n// - If the token is within 60 minutes of expiry, run\n// ``claude --print ping`` to nudge the CLI's refresh-token flow\n// - Re-read after the refresh attempt\n//\n// The watcher install/uninstall/status path is a systemd user timer\n// instead of a launchd agent.\n\ninterface LinuxCredsParsed {\n claudeAiOauth?: {\n accessToken?: string;\n expiresAt?: number;\n };\n}\n\n/** Validate the Linux credentials file and trigger a CLI refresh if\n * the token is close to expiry. Returns ``{ path }`` on success or\n * ``{ error }`` if the file is missing/malformed. Used by both the\n * one-shot Linux ``sync-claude-creds`` command and ``beastmode init``.\n */\nexport function syncClaudeCredsLinux(): { path: string } | { error: string } {\n const credsPath = linuxCredsPath();\n if (!existsSync(credsPath)) {\n return {\n error: `${credsPath} not found — run \\`claude login\\` first`,\n };\n }\n\n let parsed: LinuxCredsParsed;\n try {\n const raw = readFileSync(credsPath, \"utf-8\");\n parsed = JSON.parse(raw) as LinuxCredsParsed;\n } catch {\n return {\n error: `${credsPath} exists but is not valid JSON — run \\`claude login\\` to reset`,\n };\n }\n\n const oauth = parsed.claudeAiOauth;\n if (!oauth?.accessToken) {\n return {\n error: `${credsPath} missing claudeAiOauth.accessToken — run \\`claude login\\``,\n };\n }\n\n if (oauth.expiresAt) {\n const minutesLeft = (oauth.expiresAt - Date.now()) / 60_000;\n if (minutesLeft < 60) {\n info(\n `Token expiring in ${Math.round(minutesLeft)}min — triggering refresh via \\`claude --print ping\\`...`,\n );\n const result = spawnSync(\"claude\", [\"--print\", \"ping\"], {\n stdio: \"pipe\",\n timeout: 15000,\n });\n if (result.status !== 0) {\n warn(\n `claude --print ping failed (exit ${result.status ?? \"?\"}) — token may still be valid`,\n );\n }\n try {\n const raw2 = readFileSync(credsPath, \"utf-8\");\n const parsed2 = JSON.parse(raw2) as LinuxCredsParsed;\n if (parsed2.claudeAiOauth?.expiresAt) {\n const newMinutes =\n (parsed2.claudeAiOauth.expiresAt - Date.now()) / 60_000;\n info(`Token now valid for ${Math.round(newMinutes)} more minutes`);\n }\n } catch {\n // ignore re-read failure — best-effort logging\n }\n }\n }\n\n return { path: credsPath };\n}\n\nfunction buildServiceUnit(\n nodePath: string,\n cliEntry: string,\n logPath: string,\n): string {\n return `[Unit]\nDescription=BeastMode Claude credential sync\n\n[Service]\nType=oneshot\nExecStart=${nodePath} ${cliEntry} sync-claude-creds\nStandardOutput=append:${logPath}\nStandardError=append:${logPath}\n`;\n}\n\nfunction buildTimerUnit(intervalSeconds: number): string {\n return `[Unit]\nDescription=BeastMode Claude credential sync timer\n\n[Timer]\nOnBootSec=30s\nOnUnitActiveSec=${intervalSeconds}s\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n`;\n}\n\nfunction ensureSystemctlAvailable(): string | null {\n const result = spawnSync(\"systemctl\", [\"--version\"], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (result.status !== 0) {\n return \"systemctl not available — systemd user units not supported on this system\";\n }\n return null;\n}\n\n/** Install the credential-sync systemd user timer.\n *\n * ``throwOnError`` flips the failure behavior:\n * - CLI entry (``sync-claude-creds --install``) passes ``false`` and\n * treats systemctl errors as a hard ``process.exit(1)``.\n * - ``beastmode init`` passes ``true`` so a flaky install becomes a\n * warning instead of a blown-up scaffold.\n */\nexport function installAgentLinux(\n intervalSeconds: number,\n { throwOnError = false }: { throwOnError?: boolean } = {},\n): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n if (throwOnError) throw new Error(unavail);\n error(unavail);\n process.exit(1);\n }\n\n const unitDir = systemdUserDir();\n const logDir = join(homedir(), \".beastmode\", \"logs\");\n mkdirSync(unitDir, { recursive: true });\n mkdirSync(logDir, { recursive: true });\n\n const logPath = join(logDir, \"sync-claude-creds.log\");\n const nodePath = process.execPath;\n const cliEntry = process.argv[1];\n\n writeFileSync(\n systemdServicePath(),\n buildServiceUnit(nodePath, cliEntry, logPath),\n \"utf-8\",\n );\n writeFileSync(\n systemdTimerPath(),\n buildTimerUnit(intervalSeconds),\n \"utf-8\",\n );\n\n const reload = spawnSync(\"systemctl\", [\"--user\", \"daemon-reload\"], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (reload.status !== 0) {\n const msg = `systemctl --user daemon-reload failed: ${reload.stderr || reload.stdout}`;\n if (throwOnError) throw new Error(msg);\n error(msg);\n process.exit(1);\n }\n\n const enable = spawnSync(\n \"systemctl\",\n [\"--user\", \"enable\", \"--now\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (enable.status !== 0) {\n const msg = `systemctl --user enable --now failed: ${enable.stderr || enable.stdout}`;\n if (throwOnError) throw new Error(msg);\n error(msg);\n info(`Service: ${systemdServicePath()}`);\n info(`Timer: ${systemdTimerPath()}`);\n process.exit(1);\n }\n\n success(`Systemd timer installed: ${SYSTEMD_UNIT_NAME}.timer`);\n info(` Service: ${systemdServicePath()}`);\n info(` Timer: ${systemdTimerPath()}`);\n info(` Interval: every ${Math.round(intervalSeconds / 60)} minutes`);\n info(` Logs: ${logPath}`);\n}\n\nfunction uninstallAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n process.exit(1);\n }\n\n spawnSync(\"systemctl\", [\"--user\", \"stop\", `${SYSTEMD_UNIT_NAME}.timer`], {\n stdio: \"pipe\",\n });\n spawnSync(\n \"systemctl\",\n [\"--user\", \"disable\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\" },\n );\n\n const servicePath = systemdServicePath();\n const timerPath = systemdTimerPath();\n let removed = false;\n if (existsSync(servicePath)) {\n try {\n unlinkSync(servicePath);\n removed = true;\n } catch {\n // already gone\n }\n }\n if (existsSync(timerPath)) {\n try {\n unlinkSync(timerPath);\n removed = true;\n } catch {\n // already gone\n }\n }\n\n spawnSync(\"systemctl\", [\"--user\", \"daemon-reload\"], { stdio: \"pipe\" });\n\n if (removed) {\n success(`Systemd timer uninstalled: ${SYSTEMD_UNIT_NAME}.timer`);\n } else {\n info(\"No systemd unit files found — nothing to remove.\");\n }\n}\n\nfunction statusAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n return;\n }\n\n if (!existsSync(systemdTimerPath())) {\n info(\"Systemd timer not installed.\");\n info(\"Install with: beastmode sync-claude-creds --install\");\n return;\n }\n\n const isActive = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n const active = (isActive.stdout || \"\").trim();\n\n if (active === \"active\") {\n success(`Systemd timer active: ${SYSTEMD_UNIT_NAME}.timer`);\n } else {\n warn(`Systemd timer not active (state: ${active || \"unknown\"})`);\n }\n\n const show = spawnSync(\n \"systemctl\",\n [\n \"--user\",\n \"show\",\n `${SYSTEMD_UNIT_NAME}.service`,\n \"--property=ExecMainStartTimestamp,ExecMainStatus\",\n ],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (show.status === 0 && show.stdout) {\n for (const line of show.stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed) info(` ${trimmed}`);\n }\n }\n info(` Service: ${systemdServicePath()}`);\n info(` Timer: ${systemdTimerPath()}`);\n}\n\nfunction restartAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n process.exit(1);\n }\n const result = spawnSync(\n \"systemctl\",\n [\"--user\", \"restart\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (result.status !== 0) {\n error(\n `systemctl --user restart failed: ${result.stderr || result.stdout}`,\n );\n process.exit(1);\n }\n success(`Restarted: ${SYSTEMD_UNIT_NAME}.timer`);\n}\n\nexport const syncClaudeCredsCommand = new Command(\"sync-claude-creds\")\n .description(\n \"Sync/validate Claude credentials for Docker (macOS: extract from Keychain; Linux: validate ~/.claude/.credentials.json + refresh)\"\n )\n .option(\"--restart\", \"Restart the daemon container after syncing (one-shot only)\")\n .option(\"--install\", \"Install a watcher (launchd on macOS, systemd user timer on Linux) that re-syncs periodically\")\n .option(\"--uninstall\", \"Remove the watcher\")\n .option(\"--status\", \"Show watcher status\")\n .option(\"--interval <seconds>\", \"Sync interval for --install (default: 1800)\", \"1800\")\n .action(async (opts: SyncOptions) => {\n const plat = platform();\n\n if (plat !== \"darwin\" && plat !== \"linux\") {\n error(`Unsupported platform: ${plat}`);\n info(\"Supported: macOS (darwin), Linux\");\n process.exit(1);\n }\n\n if (opts.install) {\n header(\"Install Claude Credential Sync Agent\");\n console.log();\n const seconds = parseInt(opts.interval || \"1800\", 10);\n if (isNaN(seconds) || seconds < 60) {\n error(`Invalid --interval: ${opts.interval} (minimum 60 seconds)`);\n process.exit(1);\n }\n if (plat === \"darwin\") {\n installAgent(seconds);\n } else {\n installAgentLinux(seconds);\n }\n return;\n }\n\n if (opts.uninstall) {\n header(\"Remove Claude Credential Sync Agent\");\n console.log();\n if (plat === \"darwin\") {\n uninstallAgent();\n } else {\n uninstallAgentLinux();\n }\n return;\n }\n\n if (opts.status) {\n header(\"Claude Credential Sync Agent Status\");\n console.log();\n if (plat === \"darwin\") {\n showStatus();\n } else {\n statusAgentLinux();\n }\n return;\n }\n\n if (opts.restart && plat === \"linux\") {\n header(\"Restart Claude Credential Sync Timer\");\n console.log();\n restartAgentLinux();\n return;\n }\n\n if (plat === \"darwin\") {\n header(\"Sync Claude Code Credentials\");\n console.log();\n const rawJson = readKeychainToken();\n let credsPath: string;\n try {\n credsPath = writeCredentialsFile(rawJson);\n } catch (e) {\n error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n success(`Wrote ${credsPath}`);\n\n // Clear the daemon's urgency marker so the broker stops\n // waiting and the next launchd interval tick doesn't re-trigger\n // a redundant sync.\n removeUrgencyMarker(findFactoryDir() ?? undefined);\n\n if (opts.restart) {\n console.log();\n info(\"Restarting daemon container...\");\n const result = spawnSync(\"docker\", [\"compose\", \"restart\", \"daemon\"], { stdio: \"inherit\" });\n if (result.status !== 0) {\n warn(\"docker compose restart daemon failed — run it manually.\");\n process.exit(result.status ?? 1);\n }\n success(\"Daemon restarted.\");\n } else {\n console.log();\n info(\"Automate: beastmode sync-claude-creds --install\");\n }\n return;\n }\n\n // Linux one-shot: validate file and trigger refresh if expiring.\n header(\"Validate Claude Credentials\");\n console.log();\n const result = syncClaudeCredsLinux();\n if (\"error\" in result) {\n error(result.error);\n process.exit(1);\n }\n success(`Credentials valid: ${result.path}`);\n\n // Clear the daemon's urgency marker (same rationale as macOS path).\n removeUrgencyMarker(findFactoryDir() ?? undefined);\n\n console.log();\n info(\"Automate: beastmode sync-claude-creds --install\");\n });\n","/**\n * BeastMode MCP Server — exposes factory operations as MCP tools.\n * Uses @modelcontextprotocol/sdk with stdio transport.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from \"fs\";\nimport { join, resolve, basename } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport {\n collectStatus,\n configGet,\n configSet,\n coerceValue,\n generateDefaults,\n installPlugin,\n removePlugin,\n listMcps,\n listHooks,\n listSkills,\n detectStack,\n ENGINE_VERSION,\n} from \"../engine/index.js\";\nimport { FactoryIdentitySchema } from \"../engine/schemas.js\";\nimport type { StatusInput } from \"../engine/index.js\";\n\n// ── Helpers ──\n\nfunction readJsonFile(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction getFactoryPath(): string {\n const envPath = process.env.BEASTMODE_FACTORY_PATH;\n if (envPath && existsSync(join(envPath, \".beastmode\", \"factory.json\"))) {\n return envPath;\n }\n // Walk up from cwd\n let dir = process.cwd();\n const root = resolve(\"/\");\n while (dir !== root) {\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\n \"No BeastMode factory found. Set BEASTMODE_FACTORY_PATH or run from a factory directory.\"\n );\n}\n\nfunction readFactoryStatus(factoryDir: string): ReturnType<typeof collectStatus> {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryIdentity = FactoryIdentitySchema.parse(\n JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"))\n );\n\n const projectsDir = join(bmDir, \"projects\");\n const projectCount = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\")).length\n : 0;\n\n const lockPath = join(bmDir, \"extensions.lock\");\n let pluginNames: string[] = [];\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n pluginNames = Object.keys(lock.plugins || {});\n } catch { /* empty */ }\n }\n\n let mcpServers: Record<string, unknown> = {};\n try { mcpServers = listMcps(factoryDir); } catch { /* empty */ }\n\n let hooks: Record<string, unknown[]> = {};\n try { hooks = listHooks(factoryDir); } catch { /* empty */ }\n\n let skillCount = 0;\n try { skillCount = listSkills(factoryDir).length; } catch { /* empty */ }\n\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => {\n try { return readdirSync(join(runsDir, d)).length > 0; } catch { return false; }\n })\n .sort();\n }\n\n const pidFile = join(bmDir, \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch { pidAlive = false; }\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n };\n\n return collectStatus(input);\n}\n\ninterface BoardItem {\n id: string;\n title: string;\n description: string;\n status: string;\n created_at: string;\n updated_at: string;\n}\n\nfunction readBoardItems(factoryDir: string): BoardItem[] {\n const filePath = join(factoryDir, \".beastmode\", \"board.json\");\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(raw.items) ? raw.items : [];\n } catch { return []; }\n}\n\nfunction writeBoardItems(factoryDir: string, items: BoardItem[]): void {\n const filePath = join(factoryDir, \".beastmode\", \"board.json\");\n writeFileSync(filePath, JSON.stringify({ items }, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── MCP Server Creation ──\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer(\n { name: \"beastmode\", version: ENGINE_VERSION },\n { capabilities: { tools: {} } }\n );\n\n // ── Tool: factory_status ──\n server.tool(\n \"factory_status\",\n \"Get factory status overview including projects, plugins, runs, and daemon state\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const status = readFactoryStatus(factoryDir);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(status, null, 2) }] };\n }\n );\n\n // ── Tool: factory_config_get ──\n server.tool(\n \"factory_config_get\",\n \"Read a config value by dot-notation key path (e.g. 'pipeline.satisfaction_threshold')\",\n { key_path: z.string().describe(\"Dot-notation key path\") },\n async ({ key_path }) => {\n const factoryDir = getFactoryPath();\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const config = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n try {\n const value = configGet(config, key_path);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(value, null, 2) }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: factory_config_set ──\n server.tool(\n \"factory_config_set\",\n \"Set a config value by dot-notation key path\",\n {\n key_path: z.string().describe(\"Dot-notation key path\"),\n value: z.string().describe(\"Value to set (auto-coerced: true/false/numbers/null)\"),\n },\n async ({ key_path, value }) => {\n const factoryDir = getFactoryPath();\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const config = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n const coerced = coerceValue(value);\n const updated = configSet(config, key_path, coerced);\n writeFileSync(configPath, JSON.stringify(updated, null, 2) + \"\\n\", \"utf-8\");\n return { content: [{ type: \"text\" as const, text: `Set ${key_path} = ${JSON.stringify(coerced)}` }] };\n }\n );\n\n // ── Tool: pipeline_run ──\n server.tool(\n \"pipeline_run\",\n \"Create a task on the board to trigger a pipeline run\",\n {\n title: z.string().describe(\"Task title/description\"),\n status: z.string().optional().describe(\"Initial status (default: ready)\"),\n },\n async ({ title, status }) => {\n const factoryDir = getFactoryPath();\n const now = new Date().toISOString();\n const item: BoardItem = {\n id: randomUUID(),\n title,\n description: \"\",\n status: status || \"ready\",\n created_at: now,\n updated_at: now,\n };\n const items = readBoardItems(factoryDir);\n items.push(item);\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n // ── Tool: pipeline_status ──\n server.tool(\n \"pipeline_status\",\n \"Get active run checkpoint information\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const runsDir = join(factoryDir, \"runs\");\n if (!existsSync(runsDir)) {\n return { content: [{ type: \"text\" as const, text: \"No runs directory found.\" }] };\n }\n const runDirs = readdirSync(runsDir).sort().reverse();\n const activeRuns: Array<{ id: string; checkpoint: unknown }> = [];\n for (const id of runDirs.slice(0, 10)) {\n const cp = readJsonFile(join(runsDir, id, \"checkpoint.json\"));\n if (cp) {\n activeRuns.push({ id, checkpoint: cp });\n }\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify(activeRuns, null, 2) }] };\n }\n );\n\n // ── Tool: run_detail ──\n server.tool(\n \"run_detail\",\n \"Get detailed run information including manifest, iterations, and satisfaction\",\n { run_id: z.string().describe(\"Run ID (directory name)\") },\n async ({ run_id }) => {\n const factoryDir = getFactoryPath();\n const runDir = join(factoryDir, \"runs\", run_id);\n if (!existsSync(runDir)) {\n return { content: [{ type: \"text\" as const, text: `Run not found: ${run_id}` }], isError: true };\n }\n const manifest = readJsonFile(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(runDir, \"checkpoint.json\"));\n const iterationsDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterationsDir)) {\n for (const dir of readdirSync(iterationsDir).sort()) {\n const satisfaction = readJsonFile(join(iterationsDir, dir, \"satisfaction.json\"));\n iterations.push({ number: parseInt(dir, 10), satisfaction });\n }\n }\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ id: run_id, manifest, checkpoint, iterations }, null, 2),\n }],\n };\n }\n );\n\n // ── Tool: plugin_install ──\n server.tool(\n \"plugin_install\",\n \"Install a plugin from source (path, git URL, or registry name)\",\n { source: z.string().describe(\"Plugin source\") },\n async ({ source }) => {\n const factoryDir = getFactoryPath();\n try {\n await installPlugin(factoryDir, source);\n return { content: [{ type: \"text\" as const, text: `Plugin installed: ${source}` }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: plugin_remove ──\n server.tool(\n \"plugin_remove\",\n \"Remove an installed plugin by name\",\n { name: z.string().describe(\"Plugin name\") },\n async ({ name }) => {\n const factoryDir = getFactoryPath();\n try {\n removePlugin(factoryDir, name);\n return { content: [{ type: \"text\" as const, text: `Plugin removed: ${name}` }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: list_extensions ──\n server.tool(\n \"list_extensions\",\n \"List all installed extensions (plugins, MCP servers, hooks, skills)\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const bmDir = join(factoryDir, \".beastmode\");\n\n let plugins: Record<string, unknown> = {};\n const lockPath = join(bmDir, \"extensions.lock\");\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n plugins = lock.plugins || {};\n } catch { /* empty */ }\n }\n\n let mcps: Record<string, unknown> = {};\n try { mcps = listMcps(factoryDir); } catch { /* empty */ }\n\n let hooks: Record<string, unknown[]> = {};\n try { hooks = listHooks(factoryDir); } catch { /* empty */ }\n\n let skills: unknown[] = [];\n try { skills = listSkills(factoryDir); } catch { /* empty */ }\n\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ plugins, mcps, hooks, skills }, null, 2),\n }],\n };\n }\n );\n\n // ── Tool: project_list ──\n server.tool(\n \"project_list\",\n \"List all registered projects in this factory\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) {\n return { content: [{ type: \"text\" as const, text: \"[]\" }] };\n }\n const projects = readdirSync(projectsDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try { return JSON.parse(readFileSync(join(projectsDir, f), \"utf-8\")); } catch { return null; }\n })\n .filter(Boolean);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(projects, null, 2) }] };\n }\n );\n\n // ── Tool: project_add ──\n server.tool(\n \"project_add\",\n \"Register a new project by detecting its stack from the given path\",\n { path: z.string().describe(\"Absolute path to the project directory\") },\n async ({ path: projectPath }) => {\n const factoryDir = getFactoryPath();\n const resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) {\n return { content: [{ type: \"text\" as const, text: `Directory not found: ${resolvedPath}` }], isError: true };\n }\n const projectName = basename(resolvedPath);\n const stack = detectStack(resolvedPath);\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n repo: stack.git_remote || undefined,\n stack: {\n detected: stack.framework,\n build_command: stack.suggested_commands.build,\n dev_command: stack.suggested_commands.dev,\n test_command: stack.suggested_commands.test,\n install_command: stack.suggested_commands.install,\n dev_port: stack.dev_port,\n },\n deploy: { target: stack.suggested_deploy },\n plugins: stack.suggested_plugins,\n };\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n mkdirSync(projectsDir, { recursive: true });\n writeFileSync(\n join(projectsDir, `${projectName}.json`),\n JSON.stringify(projectConfig, null, 2) + \"\\n\",\n \"utf-8\"\n );\n return { content: [{ type: \"text\" as const, text: JSON.stringify(projectConfig, null, 2) }] };\n }\n );\n\n // ── Tool: task_create ──\n server.tool(\n \"task_create\",\n \"Create a new task on the board\",\n {\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n status: z.string().optional().describe(\"Initial status (default: new)\"),\n },\n async ({ title, description, status }) => {\n const factoryDir = getFactoryPath();\n const now = new Date().toISOString();\n const item: BoardItem = {\n id: randomUUID(),\n title,\n description: description || \"\",\n status: status || \"new\",\n created_at: now,\n updated_at: now,\n };\n const items = readBoardItems(factoryDir);\n items.push(item);\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n // ── Tool: task_list ──\n server.tool(\n \"task_list\",\n \"List all tasks on the board, optionally filtered by status\",\n { status: z.string().optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const factoryDir = getFactoryPath();\n let items = readBoardItems(factoryDir);\n if (status) {\n items = items.filter((i) => i.status === status);\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify(items, null, 2) }] };\n }\n );\n\n // ── Tool: task_update ──\n server.tool(\n \"task_update\",\n \"Update a task on the board (title, description, or status)\",\n {\n id: z.string().describe(\"Task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n status: z.string().optional().describe(\"New status\"),\n },\n async ({ id, title, description, status }) => {\n const factoryDir = getFactoryPath();\n const items = readBoardItems(factoryDir);\n const index = items.findIndex((i) => i.id === id);\n if (index === -1) {\n return { content: [{ type: \"text\" as const, text: `Task not found: ${id}` }], isError: true };\n }\n const item = items[index];\n if (title !== undefined) item.title = title;\n if (description !== undefined) item.description = description;\n if (status !== undefined) item.status = status;\n item.updated_at = new Date().toISOString();\n items[index] = item;\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n return server;\n}\n\n// ── Start the MCP server on stdio ──\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * MCP Server entry point.\n * Started via: beastmode mcp\n */\n\nexport { createMcpServer, startMcpServer } from \"./server.js\";\n","import { Command } from \"commander\";\nimport { initCommand } from \"./cli/commands/init.js\";\nimport { exportCommand } from \"./cli/commands/export-config.js\";\nimport { validateCommand } from \"./cli/commands/validate.js\";\nimport { addCommand } from \"./cli/commands/add.js\";\nimport { removeCommand } from \"./cli/commands/remove.js\";\nimport { listCommand } from \"./cli/commands/list.js\";\nimport { importCommand } from \"./cli/commands/import-cmd.js\";\nimport { statusCommand } from \"./cli/commands/status.js\";\nimport { configCommand } from \"./cli/commands/config-cmd.js\";\nimport { doctorCommand } from \"./cli/commands/doctor.js\";\nimport { upgradeCommand } from \"./cli/commands/upgrade.js\";\nimport { boardCommand } from \"./cli/commands/board.js\";\nimport { migrateCommand } from \"./cli/commands/migrate.js\";\nimport { runCommand } from \"./cli/commands/run.js\";\nimport { daemonCommand } from \"./cli/commands/daemon-cmd.js\";\nimport { mcpCommand } from \"./cli/commands/mcp-cmd.js\";\nimport { deployCommand } from \"./cli/commands/deploy.js\";\nimport { syncClaudeCredsCommand } from \"./cli/commands/sync-claude-creds.js\";\nimport { upCommand } from \"./cli/commands/up.js\";\nimport { downCommand } from \"./cli/commands/down.js\";\nimport { logsCommand } from \"./cli/commands/logs-cmd.js\";\nimport { updateCommand } from \"./cli/commands/update.js\";\nimport { runnerCommand } from \"./cli/commands/runner-cmd.js\";\nimport { projectCommand } from \"./cli/commands/project-cmd.js\";\nimport { ENGINE_VERSION } from \"./engine/version.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"beastmode\")\n .description(\"BeastMode Dark Factory — turn intent into verified software\")\n .version(ENGINE_VERSION);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(boardCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(removeCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(importCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(daemonCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(deployCommand);\nprogram.addCommand(syncClaudeCredsCommand);\nprogram.addCommand(upCommand);\nprogram.addCommand(downCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(runnerCommand);\nprogram.addCommand(projectCommand);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport { resolve, basename, join } from \"path\";\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from \"fs\";\nimport {\n detectStack,\n resolveDefaults,\n validateSecrets,\n scaffoldFactory,\n listPresets,\n getPreset,\n FactoryConfigSchema,\n} from \"../../engine/index.js\";\nimport { executeFileActions } from \"../utils/file-writer.js\";\nimport { generateComposeYaml, isGhcrAuthenticated, loginToGhcr, seedConfigFromImage } from \"../utils/docker.js\";\nimport { header, success, info, step, error, warn } from \"../utils/display.js\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Create a new BeastMode factory\")\n .argument(\"[name]\", \"Factory name (default: current directory name)\")\n .option(\"--project <path>\", \"Path to target project\")\n .option(\"--preset <preset>\", \"Pipeline preset (full, lean, prototype, infra, docs)\")\n .option(\"--backend <backend>\", \"Task backend (beastmode-board, github-issues)\")\n .option(\"--deploy <target>\", \"Deploy target (pr-only, vercel, aws-ecs, ...)\")\n .option(\"--methodology <name>\", \"Development methodology plugin\")\n .option(\"--plugin <name>\", \"Install plugin (repeatable)\", collect, [])\n .option(\"--from <template>\", \"Import config from template file\")\n .option(\"--ui\", \"Open web wizard instead of CLI\")\n .option(\"--yes\", \"Accept all defaults (non-interactive)\")\n .option(\n \"--project-github-token <token>\",\n \"GitHub PAT for the daemon's project operations (commit/push/PR/merge against PROJECT_DIR's git remote — needs `repo` scope). Alias for the legacy --github-token flag.\",\n )\n .option(\n \"--project-github-token-file <path>\",\n \"Read project GitHub PAT from file (safer than --project-github-token)\",\n )\n .option(\n \"--github-token <token>\",\n \"Deprecated alias for --project-github-token. Kept for backward compat.\",\n )\n .option(\n \"--github-token-file <path>\",\n \"Deprecated alias for --project-github-token-file. Kept for backward compat.\",\n )\n .option(\n \"--ghcr-pull-token <token>\",\n \"GitHub PAT for pulling private beastmode images from ghcr.io/develeap/beastmode/* — needs `read:packages` scope. May be the same as --project-github-token but should normally be a separate dedicated token (Gap 16).\",\n )\n .option(\n \"--ghcr-pull-token-file <path>\",\n \"Read GHCR pull token from file (safer than --ghcr-pull-token)\",\n )\n .option(\"--board-password <password>\", \"Board UI password (avoids interactive prompt)\")\n .option(\"--board-password-file <path>\", \"Read board password from file\")\n .action(async (name, opts) => {\n try {\n await runInit(name, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nfunction collect(val: string, acc: string[]): string[] {\n acc.push(val);\n return acc;\n}\n\ninterface InitOptions {\n project?: string;\n preset?: string;\n backend?: string;\n deploy?: string;\n methodology?: string;\n plugin: string[];\n from?: string;\n ui?: boolean;\n yes?: boolean;\n // Project-side GitHub PAT (commit/push/PR against PROJECT_DIR's git remote)\n projectGithubToken?: string;\n projectGithubTokenFile?: string;\n // Deprecated aliases — see --github-token / --github-token-file flags\n githubToken?: string;\n githubTokenFile?: string;\n // GHCR pull token (pull private beastmode images)\n ghcrPullToken?: string;\n ghcrPullTokenFile?: string;\n boardPassword?: string;\n boardPasswordFile?: string;\n}\n\n/**\n * Read a secret from a file path, trimming whitespace/newlines.\n */\nfunction readSecretFile(filePath: string): string {\n return readFileSync(resolve(filePath), \"utf-8\").trim();\n}\n\n/**\n * Detect if we're inside the beastmode source repo.\n * If daemon/, board/, and cli/ all exist, this is the source repo.\n */\nexport function isSourceRepo(dir: string): boolean {\n return (\n existsSync(resolve(dir, \"daemon\")) &&\n existsSync(resolve(dir, \"board\")) &&\n existsSync(resolve(dir, \"cli\"))\n );\n}\n\nasync function runInit(name: string | undefined, opts: InitOptions): Promise<void> {\n // Handle --ui flag: start web server and open browser\n if (opts.ui) {\n const { startServer } = await import(\"../ui/server.js\");\n const factoryName = name || basename(resolve(\".\"));\n const projectPath = opts.project ? resolve(opts.project) : undefined;\n\n info(\"Starting init wizard...\");\n const uiServer = await startServer({\n port: 7669,\n factoryName,\n projectPath,\n });\n\n info(`Init wizard running at ${uiServer.url}`);\n info(\"Press Ctrl+C to cancel.\\n\");\n\n // Open browser\n try {\n const open = (await import(\"open\")).default;\n await open(uiServer.url);\n } catch {\n info(`Open ${uiServer.url} in your browser to continue.`);\n }\n\n // Keep process alive until server shuts down\n await new Promise<void>((resolve) => {\n uiServer.server.on(\"close\", resolve);\n process.on(\"SIGINT\", async () => {\n info(\"\\nShutting down wizard server...\");\n await uiServer.shutdown();\n resolve();\n });\n });\n return;\n }\n\n // ── Image mode: not inside the source repo ──\n if (!isSourceRepo(resolve(\".\"))) {\n await runImageModeInit(name, opts);\n return;\n }\n\n // ── Source mode: existing behavior below ──\n const totalSteps = 5;\n\n header(\"BeastMode — Dark Factory Init\");\n info(\"Creating your Custom Dark Factory\\n\");\n\n // Resolve factory name\n const factoryName = name || basename(resolve(\".\"));\n\n if (existsSync(factoryName) && existsSync(resolve(factoryName, \".beastmode\"))) {\n throw new Error(`Factory already exists at ./${factoryName}. Use 'beastmode config' to modify.`);\n }\n\n // Handle --from template import\n if (opts.from) {\n const { readFileSync } = await import(\"fs\");\n const templateContent = readFileSync(resolve(opts.from), \"utf-8\");\n const { parseTemplate } = await import(\"../../engine/template-importer.js\");\n const template = parseTemplate(templateContent);\n\n info(`Importing from template: ${opts.from}`);\n if (template.factory_name) info(`Template factory: ${template.factory_name}`);\n\n // Use template config but still need project path\n if (!opts.project) {\n throw new Error(\"--project is required when using --from\");\n }\n const templateProjectPath = resolve(opts.project);\n const templateStack = detectStack(templateProjectPath);\n const templateProjectName = basename(templateProjectPath);\n\n const actions = scaffoldFactory(factoryName, template.config, {\n name: templateProjectName,\n repo: templateStack.git_remote || undefined,\n path: templateProjectPath,\n stack: templateStack,\n });\n\n executeFileActions(actions);\n\n for (const action of actions) {\n if (!action.path.endsWith(\".gitkeep\")) {\n success(action.path.replace(`${factoryName}/`, \"\"));\n }\n }\n\n console.log();\n header(`Factory \"${factoryName}\" created from template!`);\n console.log();\n info(` Plugins to install: ${template.plugins.join(\", \") || \"none\"}`);\n info(` Start the board: cd ${factoryName} && beastmode board`);\n console.log();\n return;\n }\n\n // ── Step 1: DETECT ──\n step(1, totalSteps, \"Detect\");\n\n let projectPath: string;\n if (opts.project) {\n projectPath = resolve(opts.project);\n } else if (opts.yes) {\n projectPath = resolve(\".\");\n info(\"No --project specified, using current directory\");\n } else {\n const answer = await inquirer.prompt([\n {\n type: \"input\",\n name: \"project\",\n message: \"Path to your project:\",\n default: \".\",\n validate: (input: string) =>\n existsSync(resolve(input)) || `Directory not found: ${input}`,\n },\n ]);\n projectPath = resolve(answer.project);\n }\n\n const stack = detectStack(projectPath);\n success(`Detected: ${stack.framework} (${stack.language}) with ${stack.package_manager || \"no package manager\"}`);\n info(` Build: ${stack.suggested_commands.build}`);\n info(` Dev: ${stack.suggested_commands.dev} (port ${stack.dev_port})`);\n info(` Test: ${stack.suggested_commands.test}`);\n if (stack.git_remote) info(` Repo: ${stack.git_remote}`);\n\n if (!opts.yes) {\n const { accept } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"accept\",\n message: \"Accept detected settings?\",\n default: true,\n },\n ]);\n if (!accept) {\n const overrides = await inquirer.prompt([\n { type: \"input\", name: \"build\", message: \"Build command:\", default: stack.suggested_commands.build },\n { type: \"input\", name: \"dev\", message: \"Dev command:\", default: stack.suggested_commands.dev },\n { type: \"input\", name: \"test\", message: \"Test command:\", default: stack.suggested_commands.test },\n { type: \"input\", name: \"install\", message: \"Install command:\", default: stack.suggested_commands.install },\n { type: \"number\", name: \"port\", message: \"Dev port:\", default: stack.dev_port },\n ]);\n stack.suggested_commands.build = overrides.build;\n stack.suggested_commands.dev = overrides.dev;\n stack.suggested_commands.test = overrides.test;\n stack.suggested_commands.install = overrides.install;\n stack.dev_port = overrides.port;\n }\n }\n\n // ── Step 2: CONFIGURE ──\n step(2, totalSteps, \"Configure\");\n\n let presetName = opts.preset || stack.suggested_preset;\n let backendAdapter = opts.backend || \"beastmode-board\";\n let deployTarget = opts.deploy || stack.suggested_deploy;\n\n if (!opts.yes) {\n const presetChoices = listPresets().map((p) => ({\n name: `${p}${p === stack.suggested_preset ? \" (recommended)\" : \"\"} — ${getPreset(p).description}`,\n value: p,\n }));\n\n const configAnswers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Pipeline preset:\",\n choices: presetChoices,\n default: stack.suggested_preset,\n },\n {\n type: \"list\",\n name: \"backend\",\n message: \"Task backend:\",\n choices: [\n { name: \"BeastMode Board (built-in, zero setup)\", value: \"beastmode-board\" },\n { name: \"GitHub Issues\", value: \"github-issues\" },\n { name: \"Linear (requires plugin)\", value: \"linear\" },\n { name: \"Jira (requires plugin)\", value: \"jira\" },\n ],\n default: \"beastmode-board\",\n },\n {\n type: \"list\",\n name: \"deploy\",\n message: \"Delivery target:\",\n choices: [\n { name: \"PR only (no deploy)\", value: \"pr-only\" },\n { name: `Vercel${stack.suggested_deploy === \"vercel\" ? \" (recommended)\" : \"\"}`, value: \"vercel\" },\n { name: \"AWS ECS (Fargate)\", value: \"aws-ecs\" },\n { name: \"AWS Lambda\", value: \"aws-lambda\" },\n { name: \"GCP Cloud Run\", value: \"gcp-cloud-run\" },\n { name: \"Kubernetes\", value: \"kubernetes\" },\n { name: \"Docker Compose\", value: \"docker-compose\" },\n { name: \"Static host\", value: \"static-host\" },\n { name: \"Custom\", value: \"custom\" },\n ],\n default: stack.suggested_deploy,\n },\n ]);\n\n presetName = configAnswers.preset;\n backendAdapter = configAnswers.backend;\n deployTarget = configAnswers.deploy;\n }\n\n success(`Preset: ${presetName}, Backend: ${backendAdapter}, Deploy: ${deployTarget}`);\n\n // ── Step 3: EXTEND ──\n step(3, totalSteps, \"Extend\");\n\n if (stack.suggested_plugins.length > 0 && !opts.yes) {\n info(`Suggested plugins for ${stack.framework}: ${stack.suggested_plugins.join(\", \")}`);\n info(\"Plugin installation will be available in Phase 2.\");\n }\n success(\"Extensions configured\");\n\n // ── Step 4: CONNECT ──\n step(4, totalSteps, \"Connect\");\n\n const partialConfig: Record<string, unknown> = {\n pipeline: { preset: presetName },\n task_backend: { adapter: backendAdapter },\n };\n const config = resolveDefaults(partialConfig, stack);\n\n // Apply file-based secrets to env before validation\n if (opts.githubTokenFile && !process.env.GITHUB_TOKEN) {\n process.env.GITHUB_TOKEN = readSecretFile(opts.githubTokenFile);\n } else if (opts.githubToken && !process.env.GITHUB_TOKEN) {\n process.env.GITHUB_TOKEN = opts.githubToken;\n }\n\n const secretReport = validateSecrets(config, process.env as Record<string, string>, {\n deploy_target: deployTarget,\n });\n\n // Show auth info\n info(\"AI auth: Claude Code CLI (`claude login`) — no API key needed\");\n\n if (secretReport.present.length > 0) {\n for (const key of secretReport.present) {\n success(`${key} found in environment`);\n }\n }\n\n // Show optional secrets (not prompted, just mentioned)\n if (secretReport.optional.length > 0) {\n for (const key of secretReport.optional) {\n info(`${key} not set (optional — for faster direct API calls)`);\n }\n }\n\n // Prompt only for required missing secrets\n if (secretReport.missing.length > 0) {\n for (const key of secretReport.missing) {\n if (opts.yes) {\n warn(`${key} not set — add to .beastmode/secrets.env.local later`);\n } else {\n const { value } = await inquirer.prompt([\n {\n type: \"password\",\n name: \"value\",\n message: `${key}:`,\n mask: \"*\",\n },\n ]);\n if (value) {\n process.env[key] = value;\n success(`${key} set`);\n } else {\n warn(`${key} skipped — add later to .beastmode/secrets.env.local`);\n }\n }\n }\n }\n\n // Board UI password\n let uiPassword = opts.boardPassword\n || (opts.boardPasswordFile ? readSecretFile(opts.boardPasswordFile) : \"\")\n || \"\";\n if (!uiPassword && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"uiPassword\",\n message: \"Board UI password (leave empty for no auth):\",\n mask: \"*\",\n },\n ]);\n uiPassword = answer.uiPassword || \"\";\n if (uiPassword) {\n success(\"Board UI password set\");\n } else {\n info(\"No board password — UI will be open (fine for local dev)\");\n }\n } else if (uiPassword) {\n success(\"Board UI password set\");\n }\n\n // ── Step 5: BOOT ──\n step(5, totalSteps, \"Boot\");\n\n const projectName = basename(projectPath);\n const actions = scaffoldFactory(factoryName, config, {\n name: projectName,\n repo: stack.git_remote || undefined,\n path: projectPath,\n stack,\n deploy_target: deployTarget,\n });\n\n executeFileActions(actions);\n\n for (const action of actions) {\n if (!action.path.endsWith(\".gitkeep\")) {\n success(action.path.replace(`${factoryName}/`, \"\"));\n }\n }\n\n // Write collected secrets\n const collectedSecrets: string[] = [];\n for (const req of secretReport.required) {\n const val = process.env[req.name];\n if (val) {\n collectedSecrets.push(`${req.name}=${val}`);\n }\n }\n if (uiPassword) {\n collectedSecrets.push(`BEASTMODE_UI_PASSWORD=${uiPassword}`);\n }\n if (collectedSecrets.length > 0) {\n const secretsPath = resolve(factoryName, \".beastmode\", \"secrets.env.local\");\n const secretsContent =\n \"# BeastMode secrets — DO NOT COMMIT\\n\" + collectedSecrets.join(\"\\n\") + \"\\n\";\n // Overwrite the placeholder secrets file\n const { writeFileSync: writeSecrets } = await import(\"fs\");\n writeSecrets(secretsPath, secretsContent, \"utf-8\");\n }\n\n // On macOS, install the Claude-creds LaunchAgent out of the box.\n //\n // Why: Claude Code stores its OAuth token in the macOS Keychain,\n // which Docker containers cannot read. Without a host-side sync,\n // every ``docker compose up -d daemon`` comes up with no\n // credentials and every Phase 1 spec run aborts with \"Claude CLI\n // Not Logged In\" (observed live 2026-04-18 after the PR #47\n // daemon rebuild — 15+ items cascaded to Stuck in under 10\n // minutes before a human spotted it).\n //\n // We seed ``~/.claude/.credentials.json`` immediately so the very\n // first daemon boot has auth, then install a launchd agent that\n // re-syncs every 30 minutes so the file stays fresh as the host\n // CLI refreshes the token. Both steps are best-effort — if the\n // user hasn't run ``claude login`` yet, we print a warning and\n // continue instead of blowing up scaffold.\n if (process.platform === \"darwin\") {\n try {\n const { syncClaudeCredsOnce, installAgent } = await import(\"./sync-claude-creds.js\");\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Claude creds sync skipped: ${sync.error}`);\n info(\" Run \\`beastmode sync-claude-creds --install\\` after \\`claude login\\`.\");\n } else {\n success(`Claude creds synced: ${sync.path}`);\n try {\n installAgent(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds LaunchAgent install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (process.platform === \"linux\") {\n // On Linux, the Claude CLI writes the credentials file directly\n // — no Keychain extraction needed. We still install a systemd\n // user timer so the OAuth token is refreshed periodically. The\n // daemon container then sees the refreshed creds via its bind\n // mount on ~/.claude/.credentials.json. Best-effort.\n try {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Claude creds check skipped: ${sync.error}`);\n info(\" Run \\`claude login\\` then \\`beastmode sync-claude-creds --install\\`.\");\n } else {\n success(`Claude creds validated: ${sync.path}`);\n try {\n installAgentLinux(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds timer install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // Final output\n console.log();\n header(`Factory \"${factoryName}\" is ready!`);\n console.log();\n info(` Start the board: cd ${factoryName} && beastmode board`);\n info(` Run locally: cd ${factoryName} && beastmode run`);\n info(` Start daemon: cd ${factoryName} && beastmode daemon`);\n info(` Add a project: beastmode add project ../other-app`);\n info(` Add a plugin: beastmode add plugin prisma`);\n if (process.platform === \"linux\") {\n info(` Deploy service: cd ${factoryName} && beastmode deploy`);\n }\n console.log();\n}\n\nasync function runImageModeInit(\n name: string | undefined,\n opts: InitOptions\n): Promise<void> {\n const totalSteps = 4;\n header(\"BeastMode — Factory Init (Image Mode)\");\n info(\"Setting up BeastMode from pre-built Docker images\\n\");\n\n const factoryName = name || \".\";\n const targetDir = resolve(factoryName === \".\" ? \".\" : factoryName);\n\n // ── Step 1: Credentials ──\n //\n // Gap 16 (2026-04-15): beastmode needs TWO distinct GitHub PATs\n // because they have orthogonal concerns:\n //\n // 1. PROJECT_GITHUB_TOKEN — used by the daemon and Claude to commit /\n // push / open PRs / merge / review against the target project repo\n // (the git remote of PROJECT_DIR). Per-user, rotates often, needs\n // `repo` scope.\n //\n // 2. GHCR_PULL_TOKEN — used by `docker compose pull` to fetch the\n // beastmode factory images from ghcr.io/develeap/beastmode/*.\n // Develeap publishes these privately, so every user needs a pull\n // token. Maintainer-provided (shareable across a team) or a\n // user-owned PAT with `read:packages` scope added. Rotates rarely.\n //\n // Conflating these in a single GITHUB_TOKEN forces users to give\n // write-level scope for a read-level task, enlarges the blast radius\n // of any leaked credential, and ties rotation cadences together.\n // See docs/zero-to-productive-readiness.md Gap 16.\n step(1, totalSteps, \"Credentials\");\n\n // Project-side PAT (the daemon's git operations)\n let projectGithubToken = opts.projectGithubToken\n || (opts.projectGithubTokenFile ? readSecretFile(opts.projectGithubTokenFile) : \"\")\n || opts.githubToken\n || (opts.githubTokenFile ? readSecretFile(opts.githubTokenFile) : \"\")\n || process.env.PROJECT_GITHUB_TOKEN\n || process.env.GITHUB_TOKEN\n || \"\";\n if (!projectGithubToken && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"token\",\n message:\n \"PROJECT_GITHUB_TOKEN (PAT for project commits/pushes/PRs — `repo` scope, or `public_repo` for public-only):\",\n mask: \"*\",\n },\n ]);\n projectGithubToken = answer.token || \"\";\n }\n if (projectGithubToken) {\n success(\"PROJECT_GITHUB_TOKEN set\");\n } else {\n warn(\"PROJECT_GITHUB_TOKEN not set — daemon's git operations will fail until added to .env\");\n }\n\n // GHCR pull token (separate concern — see Gap 16 in the readiness doc)\n let ghcrPullToken = opts.ghcrPullToken\n || (opts.ghcrPullTokenFile ? readSecretFile(opts.ghcrPullTokenFile) : \"\")\n || process.env.GHCR_PULL_TOKEN\n || \"\";\n if (!ghcrPullToken && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"token\",\n message:\n \"GHCR_PULL_TOKEN (PAT for pulling private beastmode images from ghcr.io/develeap/beastmode/* — `read:packages` scope. Leave empty to fall back to the project token):\",\n mask: \"*\",\n },\n ]);\n ghcrPullToken = answer.token || \"\";\n }\n // Sensible default: if the user provided only the project token, use\n // it for GHCR too. They can split later.\n if (!ghcrPullToken && projectGithubToken) {\n ghcrPullToken = projectGithubToken;\n info(\"GHCR_PULL_TOKEN: falling back to PROJECT_GITHUB_TOKEN (you can split them later in .env)\");\n } else if (ghcrPullToken) {\n success(\"GHCR_PULL_TOKEN set\");\n } else {\n warn(\"GHCR_PULL_TOKEN not set — `docker compose pull` will fail for private images. Add to .env later.\");\n }\n\n // Backward-compat alias used by the rest of init / compose generator\n // until they're updated to read both tokens explicitly.\n const githubToken = projectGithubToken;\n\n // Board UI password\n let uiPassword = opts.boardPassword\n || (opts.boardPasswordFile ? readSecretFile(opts.boardPasswordFile) : \"\")\n || \"\";\n if (!uiPassword && !opts.yes) {\n const { password } = await inquirer.prompt([\n {\n type: \"password\",\n name: \"password\",\n message: \"Board UI password (leave empty for no auth):\",\n mask: \"*\",\n },\n ]);\n uiPassword = password || \"\";\n if (uiPassword) success(\"Board UI password set\");\n else info(\"No board password — UI will be open\");\n } else if (uiPassword) {\n success(\"Board UI password set\");\n }\n\n // Project path — REQUIRED. The daemon's git operations target the git\n // remote of this path. Observed 2026-04-14 that a missing PROJECT_DIR\n // silently causes every task to fail 10 minutes into its build phase.\n // See docs/zero-to-productive-readiness.md Gap 1.\n let projectPath: string;\n if (opts.project) {\n projectPath = resolve(opts.project);\n if (!existsSync(projectPath)) {\n error(`--project path does not exist: ${projectPath}`);\n process.exit(1);\n }\n success(`Project path: ${projectPath}`);\n } else if (opts.yes) {\n // Non-interactive mode: fall back to the current directory, but\n // only if it looks like a git repo. Don't silently trap the user\n // in a broken factory.\n const cwd = resolve(\".\");\n if (!existsSync(join(cwd, \".git\"))) {\n error(\n \"--project is required in non-interactive mode (--yes) unless \" +\n \"you run from inside a git repository. Pass --project <path> or \" +\n \"cd into your project clone first.\"\n );\n process.exit(1);\n }\n projectPath = cwd;\n info(`No --project specified, using current directory: ${projectPath}`);\n } else {\n const answer = await inquirer.prompt([\n {\n type: \"input\",\n name: \"project\",\n message:\n \"Path to your project (must be a git clone with an origin remote):\",\n default: \".\",\n validate: (input: string) => {\n const p = resolve(input);\n if (!existsSync(p)) return `Directory not found: ${p}`;\n if (!existsSync(join(p, \".git\"))) {\n return `Not a git repo: ${p} (run 'git init' first, or pick a different path)`;\n }\n return true;\n },\n },\n ]);\n projectPath = resolve(answer.project);\n success(`Project path: ${projectPath}`);\n }\n\n // ── Step 2: Docker auth ──\n step(2, totalSteps, \"Docker Registry\");\n\n if (!isGhcrAuthenticated()) {\n // Auto-attempt login using the GHCR pull token (Gap 16). Falls back\n // to the project token if pull-token wasn't provided — they may be\n // the same value in single-PAT setups.\n const tokenForLogin = ghcrPullToken || projectGithubToken;\n if (tokenForLogin && loginToGhcr(tokenForLogin)) {\n success(\n `Authenticated to ghcr.io (via ${ghcrPullToken ? \"GHCR_PULL_TOKEN\" : \"PROJECT_GITHUB_TOKEN fallback\"})`,\n );\n } else {\n info(\"Not logged in to ghcr.io — images may still pull if public\");\n info(\" To log in manually: docker login ghcr.io -u <your-github-username>\");\n if (!opts.yes && !opts.githubToken && !opts.projectGithubToken && !opts.ghcrPullToken) {\n const { retry } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"retry\",\n message: \"Continue anyway?\",\n default: true,\n },\n ]);\n if (!retry) {\n error(\"Aborted — log in to ghcr.io first\");\n process.exit(1);\n }\n }\n }\n } else {\n success(\"Authenticated to ghcr.io\");\n }\n\n // ── Step 3: Generate files ──\n step(3, totalSteps, \"Generate\");\n\n mkdirSync(targetDir, { recursive: true });\n\n // docker-compose.yml\n const composeContent = generateComposeYaml(\"latest\");\n writeFileSync(join(targetDir, \"docker-compose.yml\"), composeContent, \"utf-8\");\n success(\"docker-compose.yml\");\n\n // .env\n //\n // PROJECT_DIR is REQUIRED (Gap 1 of the readiness checklist). We\n // write the resolved projectPath from Step 1 directly so the user\n // doesn't have to edit .env after init — observed 2026-04-14 that a\n // commented-out PROJECT_DIR silently causes every task to fail 10\n // minutes into its build phase.\n //\n // PROJECT_REPO is NOT written. As of 2026-04-15 the daemon\n // auto-resolves the github repo from `git -C $PROJECT_DIR remote\n // get-url origin` at startup (Gap 2 — see\n // daemon/beastmode_daemon/project_repo.py). The env var is only\n // needed as a last-resort override when the project dir has no\n // origin remote, and in that case we surface a clear error at\n // daemon startup telling the user exactly how to fix it.\n const envLines: string[] = [\n \"# BeastMode environment — DO NOT COMMIT\",\n \"\",\n \"# ── Project credentials (Gap 16 — two-PAT model) ──────────────\",\n \"# PROJECT_GITHUB_TOKEN: used by the daemon and Claude to commit /\",\n \"# push / open PRs / merge / review against the target project repo.\",\n \"# Needs `repo` scope for private repos, `public_repo` for public.\",\n \"# Aliased to GITHUB_TOKEN for backward compat with the gh CLI and\",\n \"# any code that still reads GITHUB_TOKEN.\",\n `PROJECT_GITHUB_TOKEN=${projectGithubToken}`,\n `GITHUB_TOKEN=${projectGithubToken}`,\n \"\",\n \"# GHCR_PULL_TOKEN: used by `docker compose pull` to fetch the\",\n \"# beastmode factory images from ghcr.io/develeap/beastmode/*.\",\n \"# Maintainer-provided (shared across a team) or your own PAT with\",\n \"# `read:packages` scope added. Rotates rarely. May be the same as\",\n \"# PROJECT_GITHUB_TOKEN but is normally a separate dedicated token.\",\n `GHCR_PULL_TOKEN=${ghcrPullToken}`,\n \"\",\n `BEASTMODE_UI_PASSWORD=${uiPassword}`,\n \"\",\n \"# ── Project location ─────────────────────────────────────────\",\n \"# Required. The daemon's git operations target the git remote of\",\n \"# this path. The daemon auto-resolves the github repo from\",\n \"# `git -C $PROJECT_DIR remote get-url origin` at startup.\",\n `PROJECT_DIR=${projectPath}`,\n \"\",\n \"# ── Optional ─────────────────────────────────────────────────\",\n \"# Uncomment for faster direct Anthropic API calls (bypasses the\",\n \"# Claude Code subscription auth via ~/.claude.json).\",\n \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"\",\n \"# Last-resort override if the daemon's project_repo auto-resolution\",\n \"# (git remote get-url origin) doesn't work for your setup.\",\n \"# The daemon handles this automatically in >99% of cases.\",\n \"# PROJECT_REPO=owner/repo\",\n \"\",\n ];\n writeFileSync(join(targetDir, \".env\"), envLines.join(\"\\n\"), \"utf-8\");\n success(`.env (PROJECT_DIR=${projectPath}, two-PAT model)`);\n\n // Create directories\n for (const dir of [\"data\", \"runs\", \"daemon/logs\", \".beastmode\", \"config\"]) {\n mkdirSync(join(targetDir, dir), { recursive: true });\n }\n\n // ── Step 4: Pull images ──\n step(4, totalSteps, \"Pull Images\");\n\n try {\n const { execSync: exec } = await import(\"child_process\");\n exec(\"docker compose pull\", {\n cwd: targetDir,\n stdio: \"inherit\",\n timeout: 300_000,\n });\n success(\"Images pulled successfully\");\n\n // Seed default config files from the daemon image\n if (seedConfigFromImage(targetDir, \"latest\")) {\n success(\"Default config files seeded\");\n }\n } catch {\n console.log();\n error(\"Failed to pull BeastMode images from ghcr.io.\");\n console.log();\n info(\" This usually means your GitHub account doesn't have access to the\");\n info(\" BeastMode container registry.\");\n console.log();\n info(\" To fix this:\");\n info(\" 1. Ask your admin to grant you access to the BeastMode packages\");\n info(\" on the develeap GitHub org\");\n info(\" 2. Create a GitHub PAT with read:packages scope\");\n info(\" 3. Run: docker login ghcr.io -u <your-github-username>\");\n info(\" (use the PAT as password)\");\n info(\" 4. Then re-run: beastmode init\");\n console.log();\n warn(\"Files generated — fix auth above, then run: beastmode up --pull\");\n }\n\n // Same Keychain-sync setup as runInit. See the comment there for\n // the 2026-04-18 incident rationale.\n if (process.platform === \"darwin\") {\n try {\n const { syncClaudeCredsOnce, installAgent } = await import(\"./sync-claude-creds.js\");\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Claude creds sync skipped: ${sync.error}`);\n info(\" Run \\`beastmode sync-claude-creds --install\\` after \\`claude login\\`.\");\n } else {\n success(`Claude creds synced: ${sync.path}`);\n try {\n installAgent(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds LaunchAgent install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (process.platform === \"linux\") {\n // On Linux, the Claude CLI writes the credentials file directly\n // — no Keychain extraction needed. We still install a systemd\n // user timer so the OAuth token is refreshed periodically. The\n // daemon container then sees the refreshed creds via its bind\n // mount on ~/.claude/.credentials.json. Best-effort.\n try {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Claude creds check skipped: ${sync.error}`);\n info(\" Run \\`claude login\\` then \\`beastmode sync-claude-creds --install\\`.\");\n } else {\n success(`Claude creds validated: ${sync.path}`);\n try {\n installAgentLinux(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds timer install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // Final output\n console.log();\n header(\"BeastMode is ready!\");\n console.log();\n info(\" Start: beastmode up\");\n info(\" Board UI: http://localhost:8420\");\n if (uiPassword) {\n info(` Board password: ${uiPassword}`);\n }\n info(\" Add a project: beastmode project add /path/to/repo\");\n info(\" View logs: beastmode logs\");\n info(\" Stop: beastmode down\");\n info(\" Update images: beastmode update\");\n console.log();\n}\n","import { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execSync, type ExecSyncOptions } from \"child_process\";\n\nexport const GHCR_IMAGE_PREFIX = \"ghcr.io/develeap/beastmode\";\n\n/**\n * Find docker-compose.yml in a directory.\n * Returns the full path or null.\n */\nexport function findComposeFile(dir: string): string | null {\n const path = join(dir, \"docker-compose.yml\");\n return existsSync(path) ? path : null;\n}\n\n/**\n * Require docker-compose.yml to exist. Throws with a helpful message if not.\n */\nexport function requireComposeFile(dir: string): string {\n const path = findComposeFile(dir);\n if (!path) {\n throw new Error(\n \"docker-compose.yml not found in the current directory.\\n\" +\n \"Run `beastmode init` first to generate it.\"\n );\n }\n return path;\n}\n\n/**\n * Run a docker compose command. Returns stdout.\n * Throws on non-zero exit with stderr.\n */\nexport function runCompose(\n args: string[],\n opts?: { cwd?: string; inherit?: boolean }\n): string {\n const cmd = [\"docker\", \"compose\", ...args].join(\" \");\n const execOpts: ExecSyncOptions = {\n cwd: opts?.cwd ?? process.cwd(),\n encoding: \"utf-8\",\n timeout: 300_000,\n stdio: opts?.inherit ? \"inherit\" : [\"pipe\", \"pipe\", \"pipe\"],\n };\n return execSync(cmd, execOpts) as string;\n}\n\n/**\n * Check if Docker is running.\n */\nexport function isDockerRunning(): boolean {\n try {\n execSync(\"docker info\", {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the user is authenticated to ghcr.io.\n */\nexport function isGhcrAuthenticated(): boolean {\n try {\n const out = execSync(\"docker login ghcr.io --get-login 2>/dev/null\", {\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return out.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current image digest for a service.\n * Returns digest string or null.\n */\nexport function getImageDigest(service: string, cwd?: string): string | null {\n try {\n const out = execSync(\n `docker compose images ${service} --format json 2>/dev/null`,\n {\n cwd: cwd ?? process.cwd(),\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }\n );\n const parsed = JSON.parse(out.trim().split(\"\\n\")[0] || \"{}\");\n return parsed.Digest || parsed.digest || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Attempt to log in to ghcr.io using a GitHub PAT.\n * After login, verifies the credential can actually pull images (needs read:packages scope).\n * If verification fails, logs out to restore anonymous access (public images work without auth).\n * Returns true only if login AND verification succeed.\n */\nexport function loginToGhcr(token: string): boolean {\n try {\n execSync(`echo \"${token}\" | docker login ghcr.io -u beastmode --password-stdin`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // Verify the credential actually works for pulling (needs read:packages scope).\n // docker login succeeds with any valid PAT regardless of scopes — it just stores\n // the credential without checking. A token without read:packages will cause \"denied\"\n // on pull, which is worse than anonymous access for public images.\n try {\n execSync(`docker manifest inspect ${GHCR_IMAGE_PREFIX}/board:latest`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n // Token lacks read:packages — remove the bad credential to restore anonymous access\n try {\n execSync(\"docker logout ghcr.io\", {\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore logout failures\n }\n return false;\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Seed default config files from the daemon image into a host directory.\n * Creates a temporary container, copies /app/config/ contents, then removes it.\n * Non-fatal — entrypoint self-seed is the fallback.\n */\nexport function seedConfigFromImage(targetDir: string, tag: string): boolean {\n const configDir = join(targetDir, \"config\");\n const containerName = \"bm-config-seed\";\n try {\n // Clean up any leftover container from a previous failed run\n try {\n execSync(`docker rm -f ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore — container doesn't exist\n }\n\n execSync(`docker create --name ${containerName} ${GHCR_IMAGE_PREFIX}/daemon:${tag}`, {\n encoding: \"utf-8\",\n timeout: 30_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n execSync(`docker cp ${containerName}:/app/config/. \"${configDir}/\"`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n execSync(`docker rm ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n // Non-fatal cleanup\n try {\n execSync(`docker rm -f ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore\n }\n return false;\n }\n}\n\n/**\n * Generate a docker-compose.yml with GHCR image references.\n */\nexport function generateComposeYaml(tag: string): string {\n return `services:\n # Python board API — data layer (SQLite + WebSocket). Internal only.\n board:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/board:${tag}\n expose:\n - \"8080\"\n volumes:\n - ./data:/app/data\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request; urllib.request.urlopen('http://localhost:8080/api/health')\"]\n interval: 10s\n timeout: 5s\n retries: 3\n start_period: 5s\n restart: unless-stopped\n\n # Node.js UI server — board UI with password auth.\n # Access at http://localhost:8420\n ui:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/ui:${tag}\n ports:\n - \"\\${UI_PORT:-8420}:8080\"\n env_file:\n - path: .env\n required: false\n environment:\n - BEASTMODE_BOARD_URL=http://board:8080\n - BEASTMODE_UI_PASSWORD=\\${BEASTMODE_UI_PASSWORD:-}\n volumes:\n - ./.beastmode:/app/.beastmode\n # Daemon config files. The Settings UI writes pipeline.* changes here\n # so they propagate to the daemon container on next restart.\n - ./config:/app/config\n - ./runs:/app/runs\n - ./daemon/logs:/app/daemon/logs:ro\n # Claude credentials for the chat feature. Claude Code stores\n # auth in TWO places on the host: ~/.claude.json (sibling file,\n # auth + settings) and ~/.claude/ (directory with backups/,\n # projects/, ...). Both must be mounted — the daemon's\n # docker-entrypoint.sh reads $HOME/.claude.json directly, and\n # pre-2026-04-18 only the directory was mounted, so every\n # container recreate came up un-authenticated and every Phase 1\n # spec run aborted with \"Claude CLI Not Logged In\".\n - type: bind\n source: \\${HOME}/.claude.json\n target: /home/appuser/.claude.json\n read_only: true\n - \\${HOME}/.claude:/home/appuser/.claude:ro\n depends_on:\n board:\n condition: service_healthy\n restart: unless-stopped\n\n # Pipeline daemon — polls board, runs tasks\n daemon:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/daemon:${tag}\n env_file:\n - path: .env\n required: false\n environment:\n - BEASTMODE_MODE=daemon\n - BEASTMODE_CONFIG=/app/config/beastmode.docker.json\n - BEASTMODE_ROOT=/app\n - BEASTMODE_BOARD_URL=http://board:8080\n volumes:\n # Factory state (projects, extensions, deploy strategies). Shared\n # with the ui container so Settings UI edits AND daemon-side\n # template seeding (from project-templates/) both land in the same\n # bind-mounted location. Pre-2026-04-15 this mount was missing\n # from the daemon service, which silently caused the daemon's\n # template-seeding logic to write to ephemeral in-container\n # storage — the seeded files were invisible to the ui and lost\n # on restart.\n - ./.beastmode:/app/.beastmode\n # Daemon config files. Mounted from the host so Settings UI writes\n # (to beastmode.docker.json) are picked up on daemon restart without\n # rebuilding the image.\n - ./config:/app/config\n - ./runs:/app/runs\n - ./daemon/logs:/app/daemon/logs\n - /var/run/docker.sock:/var/run/docker.sock\n # PROJECT_DIR is REQUIRED — the daemon targets its git remote for\n # all merge/push/PR operations. Writing without a fallback so\n # 'docker compose up' fails loudly if the user has deleted the\n # PROJECT_DIR line from .env instead of silently mounting the\n # beatmode runtime dir (which has no source code). See\n # docs/zero-to-productive-readiness.md Gap 1.\n - \\${PROJECT_DIR:?PROJECT_DIR must be set in .env — run 'beastmode init' to regenerate}:/app/project\n # See the ui service for the two-mount rationale. Without the\n # sibling-file mount every daemon recreate comes up without\n # Claude auth and every Phase 1 spec run aborts with\n # \"Claude CLI Not Logged In\" (2026-04-18 incident).\n - type: bind\n source: \\${HOME}/.claude.json\n target: /home/appuser/.claude.json\n read_only: true\n - \\${HOME}/.claude:/home/appuser/.claude\n depends_on:\n board:\n condition: service_healthy\n restart: unless-stopped\n`;\n}\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync, existsSync, readdirSync } from \"fs\";\nimport { resolve, join } from \"path\";\nimport { runExportAdapter } from \"../../engine/export-adapter.js\";\nimport { success, error, info, header } from \"../utils/display.js\";\n\n// ── Existing config export (unchanged) ──\n\nexport function exportFactory(factoryDir: string, outputPath: string): void {\n const bmDir = join(factoryDir, \".beastmode\");\n\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(`No factory found at ${factoryDir}`);\n }\n\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const identity = JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"));\n\n let plugins: string[] = [];\n const lockPath = join(bmDir, \"extensions.lock\");\n if (existsSync(lockPath)) {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n plugins = Object.keys(lock.plugins || {});\n }\n\n const template = {\n factory_name: identity.factory_name,\n engine_version: identity.engine_version,\n config,\n plugins,\n };\n\n writeFileSync(outputPath, JSON.stringify(template, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Artifact export helpers ──\n\nfunction findRunDir(runId: string): string {\n // Search in current directory's runs/ and direct path patterns\n const candidates = [\n resolve(\".\", \"runs\", runId),\n resolve(\".\", runId),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `Run directory not found for '${runId}'. Searched: ${candidates.join(\", \")}`\n );\n}\n\nfunction createArtifactExportCommand(artifact: \"nlspec\" | \"plan\" | \"scenarios\"): Command {\n return new Command(artifact)\n .description(`Export ${artifact} from a pipeline run`)\n .requiredOption(\"--run <id>\", \"Run ID to export from\")\n .option(\"--adapter <id>\", \"Export adapter (default: generic:markdown)\", \"generic:markdown\")\n .option(\"--output <path>\", \"Output file path (default: stdout)\")\n .action((opts) => {\n try {\n const runDir = findRunDir(opts.run);\n\n let sourceContent: string;\n if (artifact === \"scenarios\") {\n // Concatenate all scenario files\n const scenariosDir = join(runDir, \"scenarios\");\n if (!existsSync(scenariosDir)) {\n throw new Error(`No scenarios directory found in run ${opts.run}`);\n }\n const files = readdirSync(scenariosDir)\n .filter((f) => f.endsWith(\".md\"))\n .sort();\n sourceContent = files\n .map((f) => readFileSync(join(scenariosDir, f), \"utf-8\"))\n .join(\"\\n\\n---\\n\\n\");\n } else {\n const artifactFile = artifact === \"nlspec\" ? \"nlspec.md\" : \"plan.md\";\n const artifactPath = join(runDir, artifactFile);\n if (!existsSync(artifactPath)) {\n throw new Error(`${artifactFile} not found in run ${opts.run}`);\n }\n sourceContent = readFileSync(artifactPath, \"utf-8\");\n }\n\n const result = runExportAdapter(opts.adapter, sourceContent);\n\n if (opts.output) {\n writeFileSync(resolve(opts.output), result, \"utf-8\");\n header(`Exported ${artifact}`);\n success(`Written to: ${opts.output}`);\n } else {\n process.stdout.write(result);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\n// ── Build the export command ──\n\nexport const exportCommand = new Command(\"export\")\n .description(\"Export factory config or pipeline artifacts\");\n\n// Config export (existing)\nexportCommand.addCommand(\n new Command(\"config\")\n .description(\"Export factory configuration template (secrets excluded)\")\n .option(\"--output <path>\", \"Output file path\", \"beastmode-template.json\")\n .action((opts) => {\n try {\n const factoryDir = resolve(\".\");\n exportFactory(factoryDir, resolve(opts.output));\n header(\"Factory template exported\");\n success(`Written to: ${opts.output}`);\n info(\"Share with teammates: beastmode init my-factory --from \" + opts.output);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n);\n\n// Artifact exports (new)\nexportCommand.addCommand(createArtifactExportCommand(\"nlspec\"));\nexportCommand.addCommand(createArtifactExportCommand(\"plan\"));\nexportCommand.addCommand(createArtifactExportCommand(\"scenarios\"));\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { validateFactory } from \"../../engine/config-validator.js\";\nimport { header, success, warn, error, info } from \"../utils/display.js\";\n\nexport const validateCommand = new Command(\"validate\")\n .description(\"Validate factory health\")\n .option(\"--verbose\", \"Show all checks\")\n .action((opts) => {\n const factoryDir = resolve(\".\");\n const result = validateFactory(factoryDir, process.env as Record<string, string>);\n\n header(\"Factory Validation\");\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n error(err);\n }\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n warn(w);\n }\n }\n\n if (result.valid) {\n console.log();\n success(\"All checks passed. Factory is ready.\");\n } else {\n console.log();\n error(`${result.errors.length} error(s) found. Fix them before running.`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { installPlugin } from \"../../engine/plugin-installer.js\";\nimport { addMcp } from \"../../engine/mcp-manager.js\";\nimport { addHook } from \"../../engine/hook-manager.js\";\nimport { addSkill } from \"../../engine/skill-manager.js\";\nimport { success, error } from \"../utils/display.js\";\nimport type { HookEvent } from \"../../engine/types.js\";\n\n/**\n * Install a plugin from a local path, git URL, or registry name.\n * Currently only local paths are supported. Git/registry will be added later.\n */\nexport async function addPluginAction(\n factoryDir: string,\n source: string,\n options?: { version?: string }\n): Promise<void> {\n // For now, only local paths are supported\n // Future: detect source type and handle git clone / registry fetch\n await installPlugin(factoryDir, source);\n}\n\n/**\n * Add an MCP server to the factory.\n */\nexport function addMcpAction(\n factoryDir: string,\n name: string,\n command: string,\n args: string[],\n config?: Record<string, unknown>\n): void {\n addMcp(factoryDir, name, {\n command,\n args,\n config: config || {},\n source: \"user\",\n enabled: true,\n });\n}\n\n/**\n * Add a skill from a directory path.\n */\nexport function addSkillAction(\n factoryDir: string,\n sourcePath: string\n): void {\n addSkill(factoryDir, resolve(sourcePath));\n}\n\n/**\n * Add a hook to a pipeline event.\n */\nexport function addHookAction(\n factoryDir: string,\n event: HookEvent,\n name: string,\n options: {\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n }\n): void {\n addHook(factoryDir, event, {\n name,\n command: options.command,\n skill: options.skill,\n webhook: options.webhook,\n config: options.config || {},\n source: \"user\",\n });\n}\n\nexport const addCommand = new Command(\"add\")\n .description(\"Add extensions to the factory\")\n .addCommand(\n new Command(\"plugin\")\n .description(\"Install a plugin (from path, URL, or registry name)\")\n .argument(\"<source>\", \"Plugin source: local path, git URL, or registry name\")\n .option(\"--version <ver>\", \"Specific version to install\")\n .action(async (source: string, opts: { version?: string }) => {\n try {\n const factoryDir = resolve(\".\");\n await addPluginAction(factoryDir, source, opts);\n success(`Plugin installed from ${source}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"mcp\")\n .description(\"Add an MCP server\")\n .argument(\"<name>\", \"Server name\")\n .requiredOption(\"--command <cmd>\", \"Command to run\")\n .option(\"--args <args...>\", \"Command arguments\", [])\n .option(\"--config <json>\", \"Configuration as JSON string\")\n .action(\n (\n name: string,\n opts: { command: string; args: string[]; config?: string }\n ) => {\n try {\n const factoryDir = resolve(\".\");\n const config = opts.config\n ? JSON.parse(opts.config)\n : undefined;\n addMcpAction(factoryDir, name, opts.command, opts.args, config);\n success(`MCP server '${name}' added`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command(\"skill\")\n .description(\"Add a custom skill from a directory\")\n .argument(\"<path>\", \"Path to skill directory (must contain SKILL.md)\")\n .action((path: string) => {\n try {\n const factoryDir = resolve(\".\");\n addSkillAction(factoryDir, path);\n success(`Skill added from ${path}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"hook\")\n .description(\"Add a pipeline hook\")\n .argument(\"<event>\", \"Hook event (e.g., pre-build, post-verify)\")\n .argument(\"<name>\", \"Hook name\")\n .option(\"--command <cmd>\", \"Shell command to run\")\n .option(\"--skill <name>\", \"Skill to invoke\")\n .option(\"--webhook <url>\", \"Webhook URL to POST to\")\n .option(\"--config <json>\", \"Configuration as JSON string\")\n .action(\n (\n event: string,\n name: string,\n opts: {\n command?: string;\n skill?: string;\n webhook?: string;\n config?: string;\n }\n ) => {\n try {\n const factoryDir = resolve(\".\");\n const config = opts.config\n ? JSON.parse(opts.config)\n : undefined;\n addHookAction(factoryDir, event as HookEvent, name, {\n command: opts.command,\n skill: opts.skill,\n webhook: opts.webhook,\n config,\n });\n success(`Hook '${name}' added to ${event}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n }\n )\n );\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { removePlugin } from \"../../engine/plugin-installer.js\";\nimport { removeMcp } from \"../../engine/mcp-manager.js\";\nimport { removeHook } from \"../../engine/hook-manager.js\";\nimport { removeSkill } from \"../../engine/skill-manager.js\";\nimport { success, error } from \"../utils/display.js\";\nimport type { HookEvent } from \"../../engine/types.js\";\n\n/**\n * Remove an installed plugin.\n */\nexport function removePluginAction(\n factoryDir: string,\n name: string,\n options?: { force?: boolean }\n): void {\n removePlugin(factoryDir, name, options);\n}\n\n/**\n * Remove an MCP server.\n */\nexport function removeMcpAction(\n factoryDir: string,\n name: string\n): void {\n removeMcp(factoryDir, name);\n}\n\n/**\n * Remove a custom skill.\n */\nexport function removeSkillAction(\n factoryDir: string,\n name: string\n): void {\n removeSkill(factoryDir, name);\n}\n\n/**\n * Remove a hook from a pipeline event.\n */\nexport function removeHookAction(\n factoryDir: string,\n event: HookEvent,\n name: string\n): void {\n removeHook(factoryDir, event, name);\n}\n\nexport const removeCommand = new Command(\"remove\")\n .description(\"Remove extensions from the factory\")\n .addCommand(\n new Command(\"plugin\")\n .description(\"Remove an installed plugin\")\n .argument(\"<name>\", \"Plugin name\")\n .option(\"--force\", \"Force removal even if other plugins depend on it\")\n .action((name: string, opts: { force?: boolean }) => {\n try {\n const factoryDir = resolve(\".\");\n removePluginAction(factoryDir, name, opts);\n success(`Plugin '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"mcp\")\n .description(\"Remove an MCP server\")\n .argument(\"<name>\", \"Server name\")\n .action((name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeMcpAction(factoryDir, name);\n success(`MCP server '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"skill\")\n .description(\"Remove a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .action((name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeSkillAction(factoryDir, name);\n success(`Skill '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"hook\")\n .description(\"Remove a pipeline hook\")\n .argument(\"<event>\", \"Hook event (e.g., pre-build, post-verify)\")\n .argument(\"<name>\", \"Hook name\")\n .action((event: string, name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeHookAction(factoryDir, event as HookEvent, name);\n success(`Hook '${name}' removed from ${event}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n );\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { listMcps } from \"../../engine/mcp-manager.js\";\nimport { listHooks } from \"../../engine/hook-manager.js\";\nimport { listSkills } from \"../../engine/skill-manager.js\";\nimport { listPresets, getPreset } from \"../../engine/presets.js\";\nimport { header } from \"../utils/display.js\";\n\nexport function listPluginsAction(factoryDir: string): void {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n console.log(\" No plugins installed (extensions.lock not found).\");\n return;\n }\n\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n const plugins = lock.plugins || {};\n const names = Object.keys(plugins);\n\n if (names.length === 0) {\n console.log(\" No plugins installed.\");\n return;\n }\n\n header(\"Installed Plugins\");\n for (const name of names) {\n const entry = plugins[name];\n const source = entry.source || \"unknown\";\n const version = entry.version || \"?\";\n console.log(` ${name}@${version} (source: ${source})`);\n }\n}\n\nexport function listMcpsAction(factoryDir: string): void {\n const servers = listMcps(factoryDir);\n const names = Object.keys(servers);\n\n if (names.length === 0) {\n console.log(\" No MCP servers configured.\");\n return;\n }\n\n header(\"MCP Servers\");\n for (const name of names) {\n const entry = servers[name];\n const status = entry.enabled ? \"enabled\" : \"disabled\";\n const cmd = [entry.command, ...entry.args].join(\" \");\n console.log(` ${name} ${cmd} [${entry.source}] (${status})`);\n }\n}\n\nexport function listSkillsAction(factoryDir: string): void {\n const skills = listSkills(factoryDir);\n\n if (skills.length === 0) {\n console.log(\" No skills available.\");\n return;\n }\n\n header(\"Skills\");\n for (const skill of skills) {\n const desc = skill.description ? ` — ${skill.description}` : \"\";\n console.log(` ${skill.name} [${skill.source}]${desc}`);\n }\n}\n\nexport function listHooksAction(factoryDir: string): void {\n const allHooks = listHooks(factoryDir);\n let hasAny = false;\n\n for (const event of Object.keys(allHooks)) {\n const hooks = allHooks[event as keyof typeof allHooks];\n if (hooks && hooks.length > 0) {\n hasAny = true;\n }\n }\n\n if (!hasAny) {\n console.log(\" No hooks configured.\");\n return;\n }\n\n header(\"Hooks\");\n for (const event of Object.keys(allHooks)) {\n const hooks = allHooks[event as keyof typeof allHooks];\n if (!hooks || hooks.length === 0) continue;\n\n console.log(` ${event}:`);\n for (const hook of hooks) {\n const type = hook.command\n ? `cmd: ${hook.command}`\n : hook.skill\n ? `skill: ${hook.skill}`\n : hook.webhook\n ? `webhook: ${hook.webhook}`\n : \"unknown\";\n console.log(` ${hook.name} (${type}) [${hook.source}]`);\n }\n }\n}\n\nexport function listPresetsAction(): void {\n header(\"Pipeline Presets\");\n for (const name of listPresets()) {\n const preset = getPreset(name);\n console.log(` ${name} — ${preset.description}`);\n }\n}\n\nexport const listCommand = new Command(\"list\")\n .description(\"List installed extensions and resources\")\n .addCommand(\n new Command(\"plugins\")\n .description(\"List installed plugins\")\n .action(() => {\n listPluginsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"mcps\")\n .description(\"List configured MCP servers\")\n .action(() => {\n listMcpsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"skills\")\n .description(\"List available skills\")\n .action(() => {\n listSkillsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"hooks\")\n .description(\"List configured hooks\")\n .action(() => {\n listHooksAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"presets\")\n .description(\"List available pipeline presets\")\n .action(() => {\n listPresetsAction();\n })\n );\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { resolve, join } from \"path\";\nimport { runImportAdapter } from \"../../engine/import-adapter.js\";\nimport { success, error, info, header } from \"../utils/display.js\";\n\nconst VALID_ARTIFACTS = [\"nlspec\", \"plan\", \"scenarios\"] as const;\ntype ImportArtifact = typeof VALID_ARTIFACTS[number];\n\nfunction createArtifactCommand(artifact: ImportArtifact): Command {\n return new Command(artifact)\n .description(`Import external document as ${artifact}`)\n .requiredOption(\"--from <path>\", \"Path to source file\")\n .requiredOption(\"--adapter <id>\", \"Adapter ID (e.g., generic:prd, bmad:brainstorm)\")\n .option(\"--output <path>\", \"Output path (default: stdout)\")\n .action((opts) => {\n try {\n const sourcePath = resolve(opts.from);\n if (!existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n const sourceContent = readFileSync(sourcePath, \"utf-8\");\n const result = runImportAdapter(opts.adapter, sourceContent);\n\n if (opts.output) {\n const outputPath = resolve(opts.output);\n\n // For scenarios adapter, result is JSON array of {name, content}\n if (artifact === \"scenarios\" && opts.adapter.endsWith(\":test-cases\")) {\n const scenarios = JSON.parse(result);\n mkdirSync(outputPath, { recursive: true });\n for (const scenario of scenarios) {\n const filePath = join(outputPath, `${scenario.name}.md`);\n writeFileSync(filePath, scenario.content, \"utf-8\");\n success(` ${scenario.name}.md`);\n }\n header(`Imported ${scenarios.length} scenarios to ${opts.output}`);\n } else {\n writeFileSync(outputPath, result, \"utf-8\");\n header(`Imported ${artifact}`);\n success(`Written to: ${opts.output}`);\n }\n } else {\n // Output to stdout\n process.stdout.write(result);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\nexport const importCommand = new Command(\"import\")\n .description(\"Import external artifacts into BeastMode format\");\n\nfor (const artifact of VALID_ARTIFACTS) {\n importCommand.addCommand(createArtifactCommand(artifact));\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, readdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join, resolve } from \"path\";\nimport { collectStatus } from \"../../engine/status-checker.js\";\nimport { FactoryIdentitySchema } from \"../../engine/schemas.js\";\nimport type { FactoryStatus, StatusInput } from \"../../engine/status-checker.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\n\n/**\n * Core action logic — exported for testing.\n * Reads factory files and returns a FactoryStatus object.\n */\nexport function statusAction(\n factoryDir: string,\n opts: { json: boolean }\n): FactoryStatus {\n const bmDir = join(factoryDir, \".beastmode\");\n\n if (!existsSync(bmDir)) {\n throw new Error(`No factory found at ${factoryDir}`);\n }\n\n // Read factory identity\n const factoryJsonPath = join(bmDir, \"factory.json\");\n const rawIdentity = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const factoryIdentity = FactoryIdentitySchema.parse(rawIdentity);\n\n // Count projects\n const projectsDir = join(bmDir, \"projects\");\n const projectCount = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\")).length\n : 0;\n\n // Count plugins\n const pluginsDir = join(bmDir, \"plugins\");\n const pluginNames = existsSync(pluginsDir) ? readdirSync(pluginsDir) : [];\n\n // Count MCP servers\n const mcpPath = join(bmDir, \"mcp-servers.json\");\n let mcpServers: Record<string, unknown> = {};\n if (existsSync(mcpPath)) {\n try {\n const raw = JSON.parse(readFileSync(mcpPath, \"utf-8\"));\n mcpServers = raw.servers || {};\n } catch {\n // ignore parse errors\n }\n }\n\n // Count hooks\n const hooksPath = join(bmDir, \"hooks.json\");\n let hooks: Record<string, unknown[]> = {};\n if (existsSync(hooksPath)) {\n try {\n const raw = JSON.parse(readFileSync(hooksPath, \"utf-8\"));\n hooks = raw.hooks || {};\n } catch {\n // ignore parse errors\n }\n }\n\n // Count skills\n const skillsDir = join(bmDir, \"skills\");\n const skillCount = existsSync(skillsDir)\n ? readdirSync(skillsDir).length\n : 0;\n\n // Find runs\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => d.startsWith(\"run-\"))\n .sort();\n }\n\n // Check daemon PID — PID file first, then process detection fallback\n const pidPath = join(bmDir, \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidPath)) {\n try {\n daemonPid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch {\n pidAlive = false;\n }\n }\n // Fallback: detect daemon running via systemd or direct process\n if (!pidAlive) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\",\n timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n pidAlive = true;\n }\n }\n } catch {\n // pgrep not available or timed out\n }\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n };\n\n return collectStatus(input);\n}\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show factory status overview\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--watch\", \"Enable watch mode (display layer)\")\n .action((opts) => {\n const factoryDir = resolve(\".\");\n try {\n const status = statusAction(factoryDir, { json: !!opts.json });\n\n if (opts.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n header(\"Factory Status\");\n console.log();\n info(`Factory: ${status.factory_name}`);\n info(`Engine: ${status.engine_version} (schema v${status.schema_version})`);\n info(`Created: ${status.created_at.split(\"T\")[0]}`);\n console.log();\n info(\"Resources:\");\n info(` Projects ${status.counts.projects}`);\n info(` Plugins ${status.counts.plugins}`);\n info(` MCPs ${status.counts.mcps}`);\n info(` Skills ${status.counts.skills}`);\n info(` Hooks ${status.counts.hooks}`);\n console.log();\n info(\n `Last Run: ${status.last_run ? status.last_run.run_id : \"none\"}`\n );\n info(`Daemon: ${status.daemon.status}`);\n\n if (opts.watch) {\n info(\"(watch mode — re-run to refresh)\");\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { configGet, configSet, configReset, coerceValue } from \"../../engine/config-manager.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\nimport { execSync } from \"child_process\";\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"No config.json found. Run beastmode init first.\");\n }\n return JSON.parse(readFileSync(configPath, \"utf-8\"));\n}\n\nfunction writeConfig(factoryDir: string, config: Record<string, unknown>): void {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\n/**\n * Get a config value by dot-notation key. Exported for testing.\n */\nexport function configGetAction(factoryDir: string, key: string): unknown {\n const config = readConfig(factoryDir);\n return configGet(config, key);\n}\n\n/**\n * Set a config value by dot-notation key. Exported for testing.\n */\nexport function configSetAction(factoryDir: string, key: string, rawValue: string): void {\n const config = readConfig(factoryDir);\n const value = coerceValue(rawValue);\n const updated = configSet(config, key, value);\n writeConfig(factoryDir, updated);\n}\n\n/**\n * Reset config to defaults. If key provided, reset only that key.\n */\nexport function configResetAction(factoryDir: string, key?: string): void {\n const config = readConfig(factoryDir);\n const updated = configReset(config, key);\n writeConfig(factoryDir, updated);\n}\n\nconst configGetCmd = new Command(\"get\")\n .description(\"Get a config value by dot-notation key\")\n .argument(\"<key>\", \"Config key (e.g., pipeline.preset)\")\n .action((key) => {\n const factoryDir = resolve(\".\");\n try {\n const value = configGetAction(factoryDir, key);\n if (typeof value === \"object\" && value !== null) {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nconst configSetCmd = new Command(\"set\")\n .description(\"Set a config value by dot-notation key\")\n .argument(\"<key>\", \"Config key (e.g., pipeline.preset)\")\n .argument(\"<value>\", \"Value to set (auto-coerces types)\")\n .action((key, value) => {\n const factoryDir = resolve(\".\");\n try {\n configSetAction(factoryDir, key, value);\n success(`Set ${key} = ${value}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nconst configEditCmd = new Command(\"edit\")\n .description(\"Open config.json in $EDITOR\")\n .action(() => {\n const factoryDir = resolve(\".\");\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) {\n error(\"No config.json found. Run beastmode init first.\");\n process.exit(1);\n }\n const editor = process.env.EDITOR || \"vi\";\n try {\n execSync(`${editor} ${configPath}`, { stdio: \"inherit\" });\n } catch {\n error(`Failed to open editor: ${editor}`);\n process.exit(1);\n }\n });\n\nconst configResetCmd = new Command(\"reset\")\n .description(\"Reset config to defaults (all or specific key)\")\n .argument(\"[key]\", \"Optional key to reset (resets all if omitted)\")\n .action((key) => {\n const factoryDir = resolve(\".\");\n try {\n configResetAction(factoryDir, key);\n if (key) {\n success(`Reset ${key} to default`);\n } else {\n success(\"Reset all config to defaults\");\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nexport const configCommand = new Command(\"config\")\n .description(\"Manage factory configuration\")\n .addCommand(configGetCmd)\n .addCommand(configSetCmd)\n .addCommand(configEditCmd)\n .addCommand(configResetCmd);\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, readdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { homedir, platform } from \"os\";\nimport * as http from \"http\";\nimport * as https from \"https\";\nimport { runDiagnostics } from \"../../engine/doctor.js\";\nimport { FactoryIdentitySchema, FactoryConfigSchema } from \"../../engine/schemas.js\";\nimport { ENGINE_VERSION } from \"../../engine/version.js\";\nimport { checkEngineCompat } from \"../../engine/plugin-resolver.js\";\nimport type { DoctorInput, DoctorReport } from \"../../engine/doctor.js\";\nimport { header, success, warn, error, info } from \"../utils/display.js\";\nimport { isGhcrAuthenticated } from \"../utils/docker.js\";\nimport { createConnection } from \"net\";\nimport { findFactoryDir } from \"./board.js\";\n\n// ── Unused import kept for compat: checkEngineCompat is referenced by name ──\nvoid checkEngineCompat;\n\nfunction isPortInUse(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = createConnection({ port, host: \"127.0.0.1\" });\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.once(\"error\", () => {\n resolve(false);\n });\n });\n}\n\ninterface CheckResult {\n label: string;\n status: \"pass\" | \"fail\" | \"warn\" | \"info\";\n detail: string;\n fix?: string;\n}\n\nfunction tryExec(cmd: string, timeout = 8000): string | null {\n try {\n return execSync(cmd, { encoding: \"utf-8\", timeout, stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch {\n return null;\n }\n}\n\n/** HTTP GET — resolves with status code or null on error */\nfunction httpGet(url: string, timeoutMs = 5000): Promise<number | null> {\n return new Promise((resolve) => {\n const lib = url.startsWith(\"https\") ? https : http;\n const req = lib.get(url, { timeout: timeoutMs }, (res) => {\n res.resume(); // consume body\n resolve(res.statusCode ?? null);\n });\n req.on(\"error\", () => resolve(null));\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\n/** Check Claude AI auth — Claude Code CLI (subscription) or ANTHROPIC_API_KEY */\nasync function checkClaudeAuth(key: string | undefined): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n // Check Claude Code CLI auth (primary)\n const claudeInstalled = tryExec(\"claude --version 2>/dev/null\");\n if (claudeInstalled) {\n results.push({ label: \"Claude Code CLI\", status: \"pass\", detail: `installed (${claudeInstalled}) — primary AI auth` });\n } else {\n results.push({\n label: \"Claude Code CLI\",\n status: \"warn\",\n detail: \"not found — install for subscription auth\",\n fix: \"npm install -g @anthropic-ai/claude-code && claude login\",\n });\n }\n\n // macOS + Docker: check if creds file exists for container auth\n if (claudeInstalled && platform() === \"darwin\" && !key) {\n const credsPath = join(homedir(), \".claude\", \".credentials.json\");\n if (!existsSync(credsPath)) {\n results.push({\n label: \"Claude creds (Docker)\",\n status: \"warn\",\n detail: \"~/.claude/.credentials.json missing — Docker containers can't auth on macOS (Keychain not reachable)\",\n fix: \"beastmode sync-claude-creds --install (skip if not using Docker Compose or ANTHROPIC_API_KEY is set)\",\n });\n } else {\n results.push({ label: \"Claude creds (Docker)\", status: \"pass\", detail: \"~/.claude/.credentials.json present — Docker can auth\" });\n }\n }\n\n // Check ANTHROPIC_API_KEY (optional, faster direct API calls)\n if (!key) {\n if (claudeInstalled) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: \"not set (using Claude Code CLI — this is fine)\" });\n } else {\n results.push({\n label: \"ANTHROPIC_API_KEY\",\n status: \"fail\",\n detail: \"not set and Claude Code CLI not found — need at least one\",\n fix: \"Run `claude login` (recommended) or export ANTHROPIC_API_KEY=<your-key>\",\n });\n }\n return results;\n }\n\n // Key is set — validate it\n const payload = JSON.stringify({\n model: \"claude-haiku-4-5\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n });\n\n const statusCode = await new Promise<number | null>((resolve) => {\n const req = https.request(\n {\n hostname: \"api.anthropic.com\",\n path: \"/v1/messages\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": key,\n \"Content-Length\": Buffer.byteLength(payload),\n },\n timeout: 10000,\n },\n (res) => {\n res.resume();\n resolve(res.statusCode ?? null);\n }\n );\n req.on(\"error\", () => resolve(null));\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(null);\n });\n req.write(payload);\n req.end();\n });\n\n if (statusCode === null) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"warn\", detail: \"set but API unreachable (network issue?)\" });\n } else if (statusCode === 200 || statusCode === 201) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: \"valid (enables faster direct API calls)\" });\n } else if (statusCode === 401 || statusCode === 403) {\n results.push({\n label: \"ANTHROPIC_API_KEY\",\n status: claudeInstalled ? \"warn\" : \"fail\",\n detail: `invalid (HTTP ${statusCode})`,\n fix: \"Check your API key at https://console.anthropic.com\",\n });\n } else if (statusCode === 429 || statusCode === 529) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: `set (HTTP ${statusCode} — rate limited, key appears valid)` });\n } else {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"warn\", detail: `set but API returned HTTP ${statusCode}` });\n }\n\n return results;\n}\n\nfunction checkGithubToken(env: Record<string, string | undefined>): CheckResult {\n const token = env.GITHUB_TOKEN || env.GH_TOKEN;\n if (!token) {\n return {\n label: \"GITHUB_TOKEN / GH_TOKEN\",\n status: \"warn\",\n detail: \"not set\",\n fix: \"export GITHUB_TOKEN=<your-pat> or gh auth login\",\n };\n }\n\n // Validate with gh auth status\n const ghStatus = tryExec(\"gh auth status 2>&1\");\n if (ghStatus !== null && (ghStatus.includes(\"Logged in\") || ghStatus.includes(\"✓\"))) {\n return { label: \"GITHUB_TOKEN / GH_TOKEN\", status: \"pass\", detail: \"valid (gh auth ok)\" };\n }\n // gh might not be installed or token is set but gh doesn't know about it\n return { label: \"GITHUB_TOKEN / GH_TOKEN\", status: \"pass\", detail: \"set\" };\n}\n\n/**\n * Gap 16 — validate PROJECT_GITHUB_TOKEN against the actual project\n * repo's permissions. Reads the env var (with backward-compat fallback\n * to GITHUB_TOKEN), reads PROJECT_DIR from the factory's .env, derives\n * the owner/repo from `git remote get-url origin`, then hits\n * api.github.com/repos/<owner>/<repo> with the token and verifies the\n * returned `permissions.push` is true.\n *\n * This is more thorough than the legacy checkGithubToken() — it not\n * only confirms the token is valid (any github.com PAT does that) but\n * specifically that it has WRITE access to the target repo, which is\n * what beastmode's merge phase actually needs.\n */\nasync function checkProjectGithubToken(\n env: Record<string, string | undefined>,\n factoryDir: string | null,\n): Promise<CheckResult> {\n const token = env.PROJECT_GITHUB_TOKEN || env.GITHUB_TOKEN;\n if (!token) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: \"not set in env (or factory .env)\",\n fix: \"Add PROJECT_GITHUB_TOKEN=ghp_... to .env (needs `repo` scope for private, `public_repo` for public)\",\n };\n }\n\n // Try to read PROJECT_DIR from the factory .env so we can derive\n // the target repo. If we can't, just confirm the token is valid\n // against api.github.com/user (less specific but better than nothing).\n let ownerRepo: string | null = null;\n if (factoryDir) {\n const envPath = join(factoryDir, \".env\");\n if (existsSync(envPath)) {\n try {\n const content = readFileSync(envPath, \"utf-8\");\n const dirLine = content.split(\"\\n\").find(\n (l) => l.trim().startsWith(\"PROJECT_DIR=\") && !l.trim().startsWith(\"#\"),\n );\n if (dirLine) {\n const projectDir = dirLine.split(\"=\").slice(1).join(\"=\").trim();\n if (projectDir && existsSync(join(projectDir, \".git\"))) {\n const remote = tryExec(\n `git -C \"${projectDir}\" remote get-url origin 2>/dev/null`,\n );\n if (remote) {\n // Parse owner/repo — same regex as project_repo.py\n const m = remote.match(\n /(?:https?:\\/\\/[^/]+\\/|git@[^:]+:)([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?\\/?$/,\n );\n if (m) ownerRepo = `${m[1]}/${m[2]}`;\n }\n }\n }\n } catch {\n // fall through\n }\n }\n }\n\n // Hit api.github.com/repos/<owner/repo> if we have one, otherwise /user\n const apiPath = ownerRepo ? `/repos/${ownerRepo}` : \"/user\";\n const result = await new Promise<{ status: number; canPush: boolean | null }>((resolveProm) => {\n const req = https.request(\n {\n hostname: \"api.github.com\",\n path: apiPath,\n method: \"GET\",\n headers: {\n \"User-Agent\": \"beastmode-doctor\",\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n timeout: 8000,\n },\n (res) => {\n let data = \"\";\n res.on(\"data\", (chunk) => { data += chunk; });\n res.on(\"end\", () => {\n let canPush: boolean | null = null;\n try {\n const parsed = JSON.parse(data);\n if (parsed.permissions && typeof parsed.permissions.push === \"boolean\") {\n canPush = parsed.permissions.push;\n }\n } catch {\n // non-json response\n }\n resolveProm({ status: res.statusCode ?? 0, canPush });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: 0, canPush: null }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: 0, canPush: null });\n });\n req.end();\n });\n\n if (result.status === 0) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"warn\",\n detail: \"set but api.github.com unreachable (network issue?)\",\n };\n }\n if (result.status === 401 || result.status === 403) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `invalid (HTTP ${result.status}${ownerRepo ? ` for ${ownerRepo}` : \"\"})`,\n fix: \"Check the token at https://github.com/settings/tokens — needs `repo` scope (or `public_repo` for public repos only)\",\n };\n }\n if (result.status === 404 && ownerRepo) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `cannot access ${ownerRepo} (HTTP 404 — repo missing or token has no read permission)`,\n fix: \"Verify the token has access to the target repo + the repo URL is correct in PROJECT_DIR\",\n };\n }\n if (result.status >= 200 && result.status < 300) {\n if (ownerRepo && result.canPush === true) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"pass\",\n detail: `valid + write access to ${ownerRepo}`,\n };\n }\n if (ownerRepo && result.canPush === false) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `valid but NO write access to ${ownerRepo}`,\n fix: \"The token's user is not a collaborator on the target repo OR the token lacks `repo` scope\",\n };\n }\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"pass\",\n detail: ownerRepo\n ? `valid (couldn't determine permissions — repo response had no permissions field)`\n : `valid (skipped per-repo check — no PROJECT_DIR resolvable)`,\n };\n }\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"warn\",\n detail: `HTTP ${result.status}`,\n };\n}\n\n/**\n * Gap 16 — validate GHCR_PULL_TOKEN against the actual GHCR registry.\n * Reads the env var, attempts a `docker manifest inspect` against\n * ghcr.io/develeap/beastmode/board:latest. If it succeeds, the token\n * has read:packages scope and can pull beastmode images. If it fails,\n * the token is missing the scope (or wrong, or the registry is down).\n */\nfunction checkGhcrPullToken(\n env: Record<string, string | undefined>,\n): CheckResult {\n const token = env.GHCR_PULL_TOKEN;\n if (!token) {\n // Falls back to the project token in init.ts. Surface this as a\n // soft warning, not a hard fail — users may have only one PAT.\n if (env.GITHUB_TOKEN || env.PROJECT_GITHUB_TOKEN) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: \"not set; falling back to PROJECT_GITHUB_TOKEN (works if it has read:packages scope)\",\n fix: \"Set GHCR_PULL_TOKEN=ghp_... in .env for a dedicated read-only token (read:packages scope)\",\n };\n }\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"fail\",\n detail: \"not set — `docker compose pull` cannot fetch private beastmode images\",\n fix: \"Set GHCR_PULL_TOKEN=ghp_... in .env (read:packages scope)\",\n };\n }\n\n // Try `docker manifest inspect` with the token. If docker is logged\n // in to ghcr.io with this token already, this just works. If not,\n // we'd need to do `docker login ghcr.io` first — which would change\n // global docker state, which is too aggressive for a check. So we\n // inspect the existing login state via `docker login --get-login`\n // and report whichever way the credential currently is.\n const loggedIn = tryExec(\"docker login ghcr.io --get-login 2>/dev/null\");\n if (!loggedIn) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: \"set in env but docker is not logged in to ghcr.io\",\n fix: \"Run `docker login ghcr.io -u <github-username> --password-stdin <<< $GHCR_PULL_TOKEN`\",\n };\n }\n // Try the actual pull-permission check\n const inspect = tryExec(\n \"docker manifest inspect ghcr.io/develeap/beastmode/board:latest 2>&1\",\n 15000,\n );\n if (inspect && (inspect.includes(\"schemaVersion\") || inspect.includes(\"mediaType\"))) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"pass\",\n detail: `valid (logged in as ${loggedIn}, can pull beastmode images)`,\n };\n }\n if (inspect && inspect.includes(\"denied\")) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"fail\",\n detail: \"logged in but lacks read:packages scope (denied)\",\n fix: \"Generate a new PAT at https://github.com/settings/tokens with `read:packages` scope\",\n };\n }\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: `logged in as ${loggedIn} but image inspect didn't return a manifest`,\n };\n}\n\nfunction checkDocker(): CheckResult {\n const out = tryExec(\"docker info --format '{{.ServerVersion}}' 2>/dev/null\");\n if (out) {\n return { label: \"Docker\", status: \"pass\", detail: `running (v${out})` };\n }\n // Try docker version as fallback\n const ver = tryExec(\"docker version --format '{{.Server.Version}}' 2>/dev/null\");\n if (ver) {\n return { label: \"Docker\", status: \"pass\", detail: `running (v${ver})` };\n }\n return {\n label: \"Docker\",\n status: \"warn\",\n detail: \"not running or not installed\",\n fix: \"Install Docker Desktop or start the Docker daemon\",\n };\n}\n\n/**\n * Check Docker Compose is v2.0 or newer. Compose v1 is end-of-life and\n * doesn't support the `${VAR:?error}` syntax beastmode's generated\n * docker-compose.yml uses for the PROJECT_DIR guard (Gap 1).\n */\nfunction checkDockerComposeVersion(): CheckResult {\n // `docker compose version` (no hyphen — plugin form) is the modern\n // command. `docker-compose version` (hyphen — standalone) is the\n // legacy v1 command.\n const v2 = tryExec(\"docker compose version --short 2>/dev/null\");\n if (v2) {\n const major = parseInt(v2.split(\".\")[0], 10);\n if (!isNaN(major) && major >= 2) {\n return {\n label: \"Docker Compose\",\n status: \"pass\",\n detail: `v${v2} (plugin)`,\n };\n }\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: `v${v2} — need v2.0 or newer`,\n fix: \"Update Docker Desktop to the latest version\",\n };\n }\n\n // Fallback: check for legacy docker-compose v1\n const v1 = tryExec(\"docker-compose version --short 2>/dev/null\");\n if (v1) {\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: `legacy v${v1} — beastmode requires v2.0+ (plugin form)`,\n fix: \"Install Docker Compose v2 (bundled with modern Docker Desktop)\",\n };\n }\n\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: \"not installed\",\n fix: \"Install Docker Compose v2 (bundled with Docker Desktop)\",\n };\n}\n\n/**\n * Check PROJECT_DIR (from .env in the factory dir) points at a valid\n * git repo with an origin remote. This is Gap 1's acceptance criterion —\n * without it, the daemon's merge-phase code can't resolve the target\n * github repo, which is the bug that cost Story 1 ~30 minutes of\n * pipeline work today.\n */\nfunction checkProjectDirEnv(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"warn\",\n detail: \"no factory in scope\",\n };\n }\n\n const envPath = join(factoryDir, \".env\");\n if (!existsSync(envPath)) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `.env not found at ${envPath}`,\n fix: \"Run `beastmode init` in this directory to generate .env\",\n };\n }\n\n let content: string;\n try {\n content = readFileSync(envPath, \"utf-8\");\n } catch {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \".env unreadable\",\n };\n }\n\n const lines = content.split(\"\\n\");\n const line = lines.find(\n (l) => l.trim().startsWith(\"PROJECT_DIR=\") && !l.trim().startsWith(\"#\"),\n );\n if (!line) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \"PROJECT_DIR not set (or commented out)\",\n fix: \"Re-run `beastmode init --project <path>` to populate it\",\n };\n }\n\n const value = line.split(\"=\").slice(1).join(\"=\").trim();\n if (!value) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \"PROJECT_DIR is empty\",\n fix: \"Re-run `beastmode init --project <path>` to populate it\",\n };\n }\n\n if (!existsSync(value)) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `PROJECT_DIR=${value} does not exist`,\n fix: `Clone your project to ${value} or re-run 'beastmode init --project <path>'`,\n };\n }\n\n if (!existsSync(join(value, \".git\"))) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `PROJECT_DIR=${value} is not a git repo`,\n fix: \"Run `git init` in the project dir, or point PROJECT_DIR at an existing git clone\",\n };\n }\n\n // Check origin remote — Gap 2 auto-resolve needs this to work\n const remote = tryExec(`git -C \"${value}\" remote get-url origin 2>/dev/null`);\n if (!remote) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"warn\",\n detail: `${value} has no origin remote — daemon can't auto-resolve github repo (Gap 2)`,\n fix: `cd ${value} && git remote add origin <url>, or set PROJECT_REPO in .env as a last-resort override`,\n };\n }\n\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"pass\",\n detail: `${value} (origin: ${remote})`,\n };\n}\n\n/**\n * Check factory compose services are running and healthy. Without this,\n * doctor can't distinguish \"factory was never started\" from \"factory is\n * broken at runtime\". Uses `docker compose ps --format json` which\n * requires Compose v2.\n */\nasync function checkFactoryContainers(\n factoryDir: string | null,\n): Promise<CheckResult> {\n if (!factoryDir) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no factory in scope\",\n };\n }\n\n const composePath = join(factoryDir, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no docker-compose.yml in factory\",\n fix: \"Run `beastmode init` to generate one\",\n };\n }\n\n // `docker compose ps --format json` emits one JSON per line (jsonlines).\n // Each line is { Service, Name, State, Health, ... }.\n const out = tryExec(\n `docker compose -f \"${composePath}\" --project-directory \"${factoryDir}\" ps --format json 2>/dev/null`,\n 15000,\n );\n if (out === null) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"docker compose ps failed — factory may be down\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n if (!out.trim()) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no containers running\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const rows: Array<{\n Service?: string;\n Name?: string;\n State?: string;\n Health?: string;\n }> = [];\n for (const line of out.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n const parsed = JSON.parse(t);\n if (Array.isArray(parsed)) {\n for (const p of parsed) rows.push(p);\n } else {\n rows.push(parsed);\n }\n } catch {\n // skip\n }\n }\n\n if (rows.length === 0) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"docker compose ps output not parseable\",\n };\n }\n\n const required = [\"board\", \"ui\", \"daemon\"];\n const byService = new Map<string, { state?: string; health?: string; name?: string }>();\n for (const r of rows) {\n if (r.Service) {\n byService.set(r.Service, {\n state: r.State,\n health: r.Health,\n name: r.Name,\n });\n }\n }\n\n const missing = required.filter((s) => !byService.has(s));\n if (missing.length > 0) {\n return {\n label: \"Factory containers\",\n status: \"fail\",\n detail: `missing services: ${missing.join(\", \")}`,\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const unhealthy: string[] = [];\n for (const svc of required) {\n const info = byService.get(svc);\n if (!info) continue;\n if (info.state !== \"running\") {\n unhealthy.push(`${svc}(${info.state})`);\n } else if (info.health && info.health !== \"healthy\" && info.health !== \"\") {\n unhealthy.push(`${svc}(${info.health})`);\n }\n }\n\n if (unhealthy.length > 0) {\n return {\n label: \"Factory containers\",\n status: \"fail\",\n detail: `unhealthy: ${unhealthy.join(\", \")}`,\n fix: \"Check `docker compose logs <service>` for the unhealthy container\",\n };\n }\n\n return {\n label: \"Factory containers\",\n status: \"pass\",\n detail: `${required.join(\", \")} running & healthy`,\n };\n}\n\n/**\n * Check the UI container actually serves /board with 200. This catches\n * the class of bug where containers are \"running\" per compose but the\n * Node process crashed after startup, or where the board.html file is\n * missing from the image.\n */\nasync function checkUiServesBoard(): Promise<CheckResult> {\n // Try the default UI port 8420 first — matches what the template\n // ships. Fall back to 8080 (legacy) and 3000 (beastmode init wizard).\n const ports = [8420, 8080, 3000];\n for (const port of ports) {\n const code = await httpGet(`http://127.0.0.1:${port}/board`, 3000);\n if (code !== null && code >= 200 && code < 400) {\n return {\n label: \"UI /board endpoint\",\n status: \"pass\",\n detail: `http://127.0.0.1:${port}/board → ${code}`,\n };\n }\n }\n return {\n label: \"UI /board endpoint\",\n status: \"warn\",\n detail: \"no UI server responding to /board on 8420, 8080, or 3000\",\n fix: \"Check `docker compose logs ui` — the Node process may have crashed after startup\",\n };\n}\n\n/**\n * Check the daemon container can actually load its config and resolve\n * the project repo (Gap 2 auto-resolver). Runs `python -c \"...\"` inside\n * the daemon container and parses the output. Catches the Story 1-class\n * bug 30 minutes earlier: if project_repo is unresolvable, the user\n * sees it here instead of at merge time.\n */\nfunction checkDaemonConfigLoad(): CheckResult {\n // Find the daemon container by compose service label. If we're not\n // in a factory dir, skip (requires a running factory).\n const container = tryExec(\n `docker ps --filter 'label=com.docker.compose.service=daemon' --format '{{.Names}}' 2>/dev/null | head -n1`,\n );\n if (!container) {\n return {\n label: \"Daemon config\",\n status: \"warn\",\n detail: \"no daemon container running\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const pyScript = `\nfrom beastmode_daemon.config import DaemonConfig\ntry:\n c = DaemonConfig.load()\n errors = c.validate_for_startup()\n print('REPO=' + (c.github.project_repo or ''))\n print('DIR=' + str(c.project_dir or ''))\n print('ERRORS=' + ('; '.join(errors) if errors else 'none'))\nexcept Exception as e:\n print('EXC=' + type(e).__name__ + ': ' + str(e))\n `.trim();\n\n const out = tryExec(\n `docker exec ${container} python -c \"${pyScript.replace(/\"/g, '\\\\\"')}\" 2>/dev/null`,\n 12000,\n );\n if (!out) {\n return {\n label: \"Daemon config\",\n status: \"warn\",\n detail: `could not execute python inside ${container}`,\n };\n }\n\n const lines = out.split(\"\\n\");\n const repo = lines.find((l) => l.startsWith(\"REPO=\"))?.slice(5) ?? \"\";\n const dir = lines.find((l) => l.startsWith(\"DIR=\"))?.slice(4) ?? \"\";\n const errors = lines.find((l) => l.startsWith(\"ERRORS=\"))?.slice(7) ?? \"\";\n const exc = lines.find((l) => l.startsWith(\"EXC=\"))?.slice(4) ?? \"\";\n\n if (exc) {\n return {\n label: \"Daemon config\",\n status: \"fail\",\n detail: `exception: ${exc}`,\n fix: \"Check docker logs + daemon/beastmode_daemon/config.py\",\n };\n }\n\n if (errors && errors !== \"none\") {\n return {\n label: \"Daemon config\",\n status: \"fail\",\n detail: errors,\n fix: \"See docs/zero-to-productive-readiness.md Gap 2\",\n };\n }\n\n return {\n label: \"Daemon config\",\n status: \"pass\",\n detail: `repo=${repo || \"<empty>\"}, dir=${dir || \"<empty>\"}`,\n };\n}\n\nexport function checkBoardDbIntegrity(): CheckResult {\n const container = tryExec(\n `docker ps --filter 'label=com.docker.compose.service=board' --format '{{.Names}}' 2>/dev/null | head -n1`,\n );\n if (!container) {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: \"no board container running — skipped\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const pyScript = `\nimport sqlite3, glob, os\npaths = sorted(glob.glob('/app/data/*.db') + glob.glob('/app/data/boards/*.db'))\nif not paths:\n print('NONE')\nelse:\n for p in paths:\n try:\n c = sqlite3.connect(p)\n r = c.execute('PRAGMA integrity_check').fetchone()\n c.close()\n status = r[0] if r else 'unknown'\n except Exception as e:\n status = 'err:' + type(e).__name__\n print(os.path.relpath(p, '/app/data') + '|' + status)\n `.trim();\n\n const out = tryExec(\n `docker exec ${container} python3 -c \"${pyScript.replace(/\"/g, '\\\\\"')}\" 2>/dev/null`,\n 15000,\n );\n if (!out) {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: `could not execute python inside ${container}`,\n };\n }\n\n if (out.trim() === \"NONE\") {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: \"no .db files found under /app/data/ or /app/data/boards/\",\n };\n }\n\n const lines = out.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const bad: string[] = [];\n const good: string[] = [];\n for (const line of lines) {\n const [path, status] = line.split(\"|\");\n if (!path || !status) continue;\n if (status === \"ok\") {\n good.push(path);\n } else {\n bad.push(`${path}: ${status}`);\n }\n }\n\n if (bad.length > 0) {\n return {\n label: \"Board DB integrity\",\n status: \"fail\",\n detail: `${bad.length} corrupted db(s): ${bad.join(\"; \")}`,\n fix: \"Stop the factory (`docker compose down`), restore the most recent clean backup from /app/data/.gap24-backup-*, or run `sqlite3 <db> 'REINDEX;'` inside the board container. See Gap 24 in docs/zero-to-productive-readiness.md\",\n };\n }\n\n return {\n label: \"Board DB integrity\",\n status: \"pass\",\n detail: `${good.length} db(s) ok (${good.join(\", \")})`,\n };\n}\n\nexport function checkGhcrAuth(): CheckResult {\n if (isGhcrAuthenticated()) {\n return {\n label: \"GHCR (ghcr.io)\",\n status: \"pass\",\n detail: \"authenticated — can pull BeastMode images\",\n };\n }\n return {\n label: \"GHCR (ghcr.io)\",\n status: \"warn\",\n detail: \"not authenticated — cannot pull BeastMode images\",\n fix: \"docker login ghcr.io -u <github-username> (use PAT with read:packages scope)\",\n };\n}\n\nfunction checkClaudeCode(): CheckResult {\n const out = tryExec(\"claude --version 2>/dev/null\");\n if (out) {\n return { label: \"Claude Code CLI\", status: \"pass\", detail: `installed (${out})` };\n }\n return {\n label: \"Claude Code CLI\",\n status: \"fail\",\n detail: \"not found\",\n fix: \"npm install -g @anthropic-ai/claude-code\",\n };\n}\n\nfunction checkGitHubCli(): CheckResult {\n const out = tryExec(\"gh --version 2>/dev/null\");\n if (out) {\n const firstLine = out.split(\"\\n\")[0].trim();\n return { label: \"GitHub CLI\", status: \"pass\", detail: `installed (${firstLine})` };\n }\n return {\n label: \"GitHub CLI\",\n status: \"fail\",\n detail: \"not found\",\n fix: \"brew install gh (macOS) or see https://cli.github.com\",\n };\n}\n\nfunction checkProjectDirectory(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no factory found in current directory tree\",\n fix: \"Run beastmode init to create a factory\",\n };\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n const projectsDir = join(bmDir, \"projects\");\n\n if (!existsSync(projectsDir)) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no projects configured\",\n fix: \"Run: beastmode add project <path>\",\n };\n }\n\n const projectFiles = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"))\n : [];\n\n if (projectFiles.length === 0) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no projects configured\",\n fix: \"Run: beastmode add project <path>\",\n };\n }\n\n const results: string[] = [];\n let anyFail = false;\n\n for (const file of projectFiles) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n const projPath: string = proj.path || \"\";\n const projName: string = proj.name || file.replace(\".json\", \"\");\n\n if (!projPath || !existsSync(projPath)) {\n results.push(`${projName}: path not found`);\n anyFail = true;\n continue;\n }\n\n const isGit = existsSync(join(projPath, \".git\"));\n const manifests = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"pyproject.toml\",\n \"requirements.txt\", \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n ];\n const manifest = manifests.find((m) => existsSync(join(projPath, m)));\n const framework = proj.stack?.detected || manifest?.replace(\".json\", \"\") || \"unknown\";\n\n results.push(\n `${projName}: ${projPath} (${framework})${isGit ? \"\" : \" [no .git]\"}`\n );\n if (!isGit) anyFail = true;\n } catch {\n results.push(`${file}: unreadable`);\n anyFail = true;\n }\n }\n\n if (anyFail) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: results.join(\"; \"),\n fix: \"Check project paths with: beastmode doctor\",\n };\n }\n\n return {\n label: \"Project directory\",\n status: \"pass\",\n detail: results.join(\"; \"),\n };\n}\n\nasync function checkBoardServer(factoryDir: string | null): Promise<CheckResult> {\n // Default board port — check common ports\n const ports = [7669, 8080, 8420, 3000];\n const host = \"127.0.0.1\";\n\n for (const port of ports) {\n const url = `http://${host}:${port}`;\n const code = await httpGet(url, 3000);\n if (code !== null && code < 500) {\n return {\n label: \"Board server\",\n status: \"pass\",\n detail: `${url} — ${code} OK`,\n };\n }\n }\n\n return {\n label: \"Board server\",\n status: \"warn\",\n detail: \"not reachable on localhost:7669, 8080, 8420, or 3000\",\n fix: \"Start the board with: beastmode board\",\n };\n}\n\nfunction checkStack(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"Stack\",\n status: \"warn\",\n detail: \"no factory — run beastmode init\",\n };\n }\n\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) {\n return { label: \"Stack\", status: \"warn\", detail: \"no projects configured\" };\n }\n\n const projectFiles = readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"));\n if (projectFiles.length === 0) {\n return { label: \"Stack\", status: \"warn\", detail: \"no projects configured\" };\n }\n\n const stacks: string[] = [];\n for (const file of projectFiles) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n const name: string = proj.name || file.replace(\".json\", \"\");\n const detected: string = proj.stack?.detected || \"unknown\";\n const build: string = proj.stack?.build_command || \"\";\n const port: number = proj.stack?.dev_port || 3000;\n stacks.push(`${name}: ${detected} — ${build}, port ${port}`);\n } catch {\n // skip unreadable\n }\n }\n\n if (stacks.length === 0) {\n return { label: \"Stack\", status: \"warn\", detail: \"no readable project configs\" };\n }\n\n return { label: \"Stack\", status: \"pass\", detail: stacks.join(\" | \") };\n}\n\nfunction checkPlaywright(): CheckResult {\n const out = tryExec(\"npx playwright --version 2>/dev/null\");\n if (out) {\n return { label: \"Playwright\", status: \"pass\", detail: `installed (${out.trim()})` };\n }\n // Check if playwright is installed but chromium is missing\n const playwrightPkg = tryExec(\"npx playwright --version 2>&1\");\n if (playwrightPkg && playwrightPkg.includes(\"Version\")) {\n const chromiumPath = tryExec(\"npx playwright install --dry-run chromium 2>&1\");\n if (chromiumPath && chromiumPath.includes(\"chromium\")) {\n return {\n label: \"Playwright\",\n status: \"warn\",\n detail: \"installed but chromium may be missing\",\n fix: \"npx playwright install chromium\",\n };\n }\n }\n return {\n label: \"Playwright\",\n status: \"warn\",\n detail: \"not installed\",\n fix: \"npx playwright install chromium\",\n };\n}\n\nfunction checkBoardPassword(\n env: Record<string, string | undefined>,\n factoryDir: string | null\n): CheckResult {\n const envPassword = env.BEASTMODE_UI_PASSWORD;\n if (envPassword) {\n return { label: \"Board password\", status: \"pass\", detail: \"set\" };\n }\n\n // Check .env and secrets.env.local files\n if (factoryDir) {\n const dotEnv = join(factoryDir, \".env\");\n const secretsEnv = join(factoryDir, \".beastmode\", \"secrets.env.local\");\n\n for (const filePath of [dotEnv, secretsEnv]) {\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const line = lines.find((l) => l.startsWith(\"BEASTMODE_UI_PASSWORD=\"));\n if (line) {\n const val = line.split(\"=\").slice(1).join(\"=\").trim();\n if (val) {\n return { label: \"Board password\", status: \"pass\", detail: \"set (in env file)\" };\n }\n }\n } catch {\n // skip unreadable\n }\n }\n }\n }\n\n return {\n label: \"Board password\",\n status: \"warn\",\n detail: \"BEASTMODE_UI_PASSWORD not set — board UI has no auth\",\n fix: \"export BEASTMODE_UI_PASSWORD=<password> or add to .beastmode/secrets.env.local\",\n };\n}\n\n/**\n * Core factory doctor action — exported for testing.\n * Gathers factory-level inputs and runs engine diagnostics.\n */\nexport function doctorAction(\n factoryDir: string,\n env: Record<string, string | undefined>\n): DoctorReport {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryDirExists = existsSync(bmDir);\n\n // Read factory identity\n let factoryIdentity = null;\n if (factoryDirExists) {\n try {\n const raw = JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"));\n factoryIdentity = FactoryIdentitySchema.parse(raw);\n } catch {\n // identity missing or invalid\n }\n }\n\n // Read and validate config\n let config: Record<string, unknown> | null = null;\n let configParseError: string | null = null;\n if (factoryDirExists) {\n const configPath = join(bmDir, \"config.json\");\n if (existsSync(configPath)) {\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const result = FactoryConfigSchema.safeParse(raw);\n if (result.success) {\n config = raw;\n } else {\n configParseError = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n }\n } catch {\n configParseError = \"config.json is not valid JSON\";\n }\n } else {\n configParseError = \"config.json is missing\";\n }\n }\n\n // Read project paths\n const projectPaths: Array<{ name: string; path: string; exists: boolean }> = [];\n if (factoryDirExists) {\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n for (const file of readdirSync(projectsDir)) {\n if (file.endsWith(\".json\")) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n if (proj.path) {\n projectPaths.push({\n name: proj.name || file.replace(\".json\", \"\"),\n path: proj.path,\n exists: existsSync(proj.path),\n });\n }\n } catch {\n // skip invalid project files\n }\n }\n }\n }\n }\n\n // Read installed plugins\n const installedPlugins: Array<{ name: string; engine_version: string }> = [];\n if (factoryDirExists) {\n const pluginsDir = join(bmDir, \"plugins\");\n if (existsSync(pluginsDir)) {\n for (const pluginName of readdirSync(pluginsDir)) {\n const manifestPath = join(pluginsDir, pluginName, \"manifest.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n installedPlugins.push({\n name: pluginName,\n engine_version: manifest.engine_version || \"*\",\n });\n } catch {\n // skip invalid plugin manifests\n }\n }\n }\n }\n }\n\n const input: DoctorInput = {\n factoryDirExists,\n factoryIdentity,\n config,\n configParseError,\n env,\n projectPaths,\n installedPlugins,\n engineVersion: ENGINE_VERSION,\n portsInUse: [],\n };\n\n return runDiagnostics(input);\n}\n\n/**\n * Check the credential sync agent: file presence, token expiry, and\n * the watcher (launchd on macOS, systemd timer on Linux). Returns\n * an array of CheckResult so each sub-check is a separate row in\n * the doctor output.\n */\nconst SYSTEMD_CREDS_TIMER = \"beastmode-claude-creds.timer\";\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\n\nfunction checkCredentialSyncAgent(): CheckResult[] {\n const results: CheckResult[] = [];\n const credsPath = join(homedir(), \".claude\", \".credentials.json\");\n\n if (!existsSync(credsPath)) {\n results.push({\n label: \"Claude credentials file\",\n status: \"fail\",\n detail: \"~/.claude/.credentials.json not found\",\n fix:\n platform() === \"darwin\"\n ? \"Run `claude login` then `beastmode sync-claude-creds --install`\"\n : \"Run `claude login`\",\n });\n return results;\n }\n\n results.push({\n label: \"Claude credentials file\",\n status: \"pass\",\n detail: credsPath,\n });\n\n try {\n const creds = JSON.parse(readFileSync(credsPath, \"utf-8\"));\n const expiresAt = creds?.claudeAiOauth?.expiresAt;\n if (typeof expiresAt === \"number\") {\n const hoursLeft = Math.round((expiresAt - Date.now()) / 3_600_000);\n if (hoursLeft < 0) {\n results.push({\n label: \"Claude token expiry\",\n status: \"fail\",\n detail: `Token expired ${Math.abs(hoursLeft)}h ago`,\n fix: \"Run `claude login` (then `beastmode sync-claude-creds` on macOS)\",\n });\n } else if (hoursLeft < 2) {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: `Token expires in ${hoursLeft}h`,\n fix: \"Token will auto-refresh if the sync agent is running\",\n });\n } else {\n results.push({\n label: \"Claude token expiry\",\n status: \"pass\",\n detail: `Token valid (${hoursLeft}h remaining)`,\n });\n }\n } else {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: \"No expiry timestamp in credentials — cannot check freshness\",\n });\n }\n } catch {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: \"credentials file exists but could not be parsed\",\n });\n }\n\n if (platform() === \"darwin\") {\n const uid = process.getuid?.();\n const result = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (result.status === 0) {\n results.push({\n label: \"Credential sync agent\",\n status: \"pass\",\n detail: \"launchd LaunchAgent loaded\",\n });\n } else {\n results.push({\n label: \"Credential sync agent\",\n status: \"warn\",\n detail: \"launchd LaunchAgent not loaded\",\n fix: \"Run `beastmode sync-claude-creds --install`\",\n });\n }\n } else if (platform() === \"linux\") {\n const result = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", SYSTEMD_CREDS_TIMER],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if ((result.stdout || \"\").trim() === \"active\") {\n results.push({\n label: \"Credential sync agent\",\n status: \"pass\",\n detail: `${SYSTEMD_CREDS_TIMER} active`,\n });\n } else {\n results.push({\n label: \"Credential sync agent\",\n status: \"warn\",\n detail: `${SYSTEMD_CREDS_TIMER} not active`,\n fix: \"Run `beastmode sync-claude-creds --install`\",\n });\n }\n }\n\n return results;\n}\n\n/** Probe ``GET /api/credentials/status`` on the board API to surface\n * the daemon's CredentialBroker health. The endpoint is served on\n * the standard ports the board uses; if unreachable, this is reported\n * as info (not warn/fail) — Docker Compose may not be running.\n */\nasync function checkDaemonCredentialHealth(): Promise<CheckResult[]> {\n const ports = [8420, 8080];\n let parsed: Record<string, unknown> | null = null;\n let lastStatus: number | null = null;\n for (const port of ports) {\n const data = await new Promise<{ status: number | null; body: string }>(\n (resolveProm) => {\n const req = http.get(\n {\n host: \"127.0.0.1\",\n port,\n path: \"/api/credentials/status\",\n timeout: 5000,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (chunk) => {\n body += chunk;\n });\n res.on(\"end\", () => {\n resolveProm({ status: res.statusCode ?? null, body });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: null, body: \"\" }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: null, body: \"\" });\n });\n },\n );\n if (data.status !== null) {\n lastStatus = data.status;\n if (data.status >= 200 && data.status < 300) {\n try {\n parsed = JSON.parse(data.body);\n } catch {\n parsed = null;\n }\n break;\n }\n }\n }\n\n if (parsed === null) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"info\",\n detail:\n lastStatus === null\n ? \"Could not reach board API — Docker Compose may not be running (skipped)\"\n : `Board API returned HTTP ${lastStatus}`,\n },\n ];\n }\n\n const data = parsed as Record<string, unknown>;\n if (data.healthy === null) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"warn\",\n detail: \"No credential status reported — daemon may not be running\",\n },\n ];\n }\n if (data.stale === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"warn\",\n detail: `Last status report is stale (reported at ${data.reported_at})`,\n },\n ];\n }\n if (data.degraded === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"fail\",\n detail: `Broker DEGRADED — ${data.consecutive_failures ?? \"?\"} consecutive auth failures`,\n fix: \"Run `claude login` then `beastmode sync-claude-creds`\",\n },\n ];\n }\n if (data.token_expired === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"fail\",\n detail: \"Broker reports token is expired\",\n fix: \"Run `claude login` (then `beastmode sync-claude-creds` on macOS)\",\n },\n ];\n }\n return [\n {\n label: \"Daemon credential broker\",\n status: \"pass\",\n detail: `Healthy — token expires ${data.token_expires_at ?? \"unknown\"}`,\n },\n ];\n}\n\n/** Probe ``GET /api/daemon/cred-health`` on the board API.\n *\n * This is the file-based observability endpoint added by Story\n * \"Auto-sync Claude credentials to daemon\": the daemon's broker writes\n * ``.cred-health.json`` after every state transition; this endpoint\n * reads that file and adds an ``urgency_marker_present`` field. It\n * complements the push-based ``/api/credentials/status`` (which\n * depends on the scheduler reporter task) — operators can consult\n * either independently.\n *\n * Falls through to \"info\" when the API is unreachable so the doctor\n * doesn't fail when Docker Compose isn't running. */\nasync function checkDaemonCredHealth(): Promise<CheckResult[]> {\n const ports = [8420, 8080];\n let parsed: Record<string, unknown> | null = null;\n let lastStatus: number | null = null;\n\n for (const port of ports) {\n const data = await new Promise<{ status: number | null; body: string }>(\n (resolveProm) => {\n const req = http.get(\n {\n host: \"127.0.0.1\",\n port,\n path: \"/api/daemon/cred-health\",\n timeout: 5000,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (chunk) => {\n body += chunk;\n });\n res.on(\"end\", () => {\n resolveProm({ status: res.statusCode ?? null, body });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: null, body: \"\" }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: null, body: \"\" });\n });\n },\n );\n if (data.status !== null) {\n lastStatus = data.status;\n try {\n parsed = JSON.parse(data.body);\n } catch {\n parsed = null;\n }\n break;\n }\n }\n\n if (lastStatus === null) {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"info\",\n detail: \"Board API not reachable — Docker Compose may not be running (skipped)\",\n },\n ];\n }\n\n if (lastStatus === 503) {\n const detail =\n parsed && typeof parsed.detail === \"string\"\n ? String(parsed.detail)\n : \"Daemon hasn't reported credential state yet\";\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail,\n },\n ];\n }\n\n if (lastStatus !== 200 || parsed === null) {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Unexpected HTTP ${lastStatus} from /api/daemon/cred-health`,\n },\n ];\n }\n\n const data = parsed as Record<string, unknown>;\n const status = String(data.status ?? \"unknown\");\n const urgent = data.urgency_marker_present === true;\n\n if (status === \"failed\") {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"fail\",\n detail: `Broker FAILED${urgent ? \" (urgency marker present)\" : \"\"}`,\n fix: \"Run `claude login` then `beastmode sync-claude-creds`\",\n },\n ];\n }\n\n if (status === \"degraded\") {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Broker degraded${urgent ? \" — urgency marker present\" : \"\"}`,\n fix: \"Ensure the credential sync agent is running on the host\",\n },\n ];\n }\n\n if (status === \"healthy\") {\n const hours = data.token_hours_remaining;\n const detail =\n typeof hours === \"number\"\n ? `Healthy — token has ${hours.toFixed(1)}h remaining`\n : \"Healthy\";\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"pass\",\n detail,\n },\n ];\n }\n\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Unknown broker status: ${status}`,\n },\n ];\n}\n\nfunction printCheck(check: CheckResult): void {\n const labelPad = check.label.padEnd(22);\n if (check.status === \"pass\") {\n success(`${labelPad} ${check.detail}`);\n } else if (check.status === \"info\") {\n info(`${labelPad} ${check.detail}`);\n } else if (check.status === \"warn\") {\n warn(`${labelPad} ${check.detail}`);\n if (check.fix) {\n info(` Fix: ${check.fix}`);\n }\n } else {\n error(`${labelPad} ${check.detail}`);\n if (check.fix) {\n info(` Fix: ${check.fix}`);\n }\n }\n}\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\"Health check — validates the entire BeastMode setup\")\n .action(async () => {\n header(\"BeastMode Doctor\");\n console.log();\n\n const env = process.env as Record<string, string | undefined>;\n const factoryDir = findFactoryDir() ?? resolve(\".\");\n const hasFactory = existsSync(join(factoryDir, \".beastmode\"));\n\n const checks: CheckResult[] = [];\n\n // 1. Claude AI auth (CLI + optional API key)\n checks.push(...(await checkClaudeAuth(env.ANTHROPIC_API_KEY)));\n\n // 1a. Credential sync agent — file presence, token expiry, and the\n // watcher (launchd on macOS, systemd timer on Linux).\n checks.push(...checkCredentialSyncAgent());\n\n // 1b. Daemon credential broker — fetched via the board API. Falls\n // through to \"info\" (not warn/fail) if the API is unreachable\n // so this check doesn't fail when Docker Compose isn't running.\n checks.push(...(await checkDaemonCredentialHealth()));\n\n // 1c. File-based daemon cred-health endpoint. Reads the broker's\n // ``.cred-health.json`` via ``GET /api/daemon/cred-health`` —\n // complements the push-based 1b so a missing scheduler reporter\n // doesn't blind operators to broker state.\n checks.push(...(await checkDaemonCredHealth()));\n\n // 2. GITHUB_TOKEN / GH_TOKEN (legacy single-token check — kept\n // for backward compat; the two-PAT checks below are the\n // Gap 16 replacement).\n checks.push(checkGithubToken(env));\n\n // 2a. PROJECT_GITHUB_TOKEN (Gap 16) — validates against the actual\n // project repo's permissions.push field via api.github.com\n checks.push(await checkProjectGithubToken(env, hasFactory ? factoryDir : null));\n\n // 2b. GHCR_PULL_TOKEN (Gap 16) — validates against\n // ghcr.io/develeap/beastmode/board:latest manifest inspect\n checks.push(checkGhcrPullToken(env));\n\n // 3. Docker\n checks.push(checkDocker());\n\n // 4. Docker Compose v2 (required for the ${VAR:?} syntax in the\n // generated compose and for `docker compose ps --format json`\n // used by the factory-container check below). Gap 3 addition\n // 2026-04-15.\n checks.push(checkDockerComposeVersion());\n\n // 5. GHCR auth\n checks.push(checkGhcrAuth());\n\n // 6. GitHub CLI\n checks.push(checkGitHubCli());\n\n // 7. PROJECT_DIR in .env — load-bearing for Gap 1 + Gap 2.\n // Without this, the daemon can't resolve the target github repo\n // and every merge dies 30+ minutes into a build. 2026-04-15.\n checks.push(checkProjectDirEnv(hasFactory ? factoryDir : null));\n\n // 8. Project directory (existing check — enumerates configured\n // projects under .beastmode/projects/)\n checks.push(checkProjectDirectory(hasFactory ? factoryDir : null));\n\n // 9. Board server (localhost probe — legacy)\n checks.push(await checkBoardServer(hasFactory ? factoryDir : null));\n\n // 10. Factory containers (compose ps + health) — Gap 3 addition\n // 2026-04-15. Detects \"containers are running per compose but\n // the Node process crashed after startup\" class of bugs.\n checks.push(await checkFactoryContainers(hasFactory ? factoryDir : null));\n\n // 11. UI /board endpoint — makes sure the Node server is actually\n // serving, not just up per docker. Gap 3 addition 2026-04-15.\n checks.push(await checkUiServesBoard());\n\n // 12. Daemon config load — runs python -c inside the daemon\n // container and asserts DaemonConfig.load() succeeds and\n // validate_for_startup() returns []. This is the most\n // comprehensive check — it exercises Gap 2's resolver against\n // the real runtime environment. Gap 3 addition 2026-04-15.\n checks.push(checkDaemonConfigLoad());\n\n // 13. Board DB integrity — runs `PRAGMA integrity_check` against\n // every board SQLite file inside the board container. Detects\n // the corruption class that out-of-process sqlite3 writes cause\n // against a WAL-mode aiosqlite connection. Gap 24 addition\n // 2026-04-16.\n checks.push(checkBoardDbIntegrity());\n\n // 14. Stack\n checks.push(checkStack(hasFactory ? factoryDir : null));\n\n // 14. Playwright\n checks.push(checkPlaywright());\n\n // 15. Board UI password\n checks.push(checkBoardPassword(env, hasFactory ? factoryDir : null));\n\n // Print all checks\n for (const check of checks) {\n printCheck(check);\n }\n\n // Summary\n const passed = checks.filter((c) => c.status === \"pass\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warnings = checks.filter((c) => c.status === \"warn\").length;\n const total = checks.length;\n\n console.log();\n const parts: string[] = [];\n parts.push(`${passed}/${total} passed`);\n if (failed > 0) parts.push(`${failed} error${failed !== 1 ? \"s\" : \"\"}`);\n if (warnings > 0) parts.push(`${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n info(parts.join(\". \") + \".\");\n\n // Also run factory-level diagnostics if inside a factory\n if (hasFactory) {\n console.log();\n info(\"Factory diagnostics:\");\n const report = doctorAction(factoryDir, env);\n for (const check of report.checks) {\n const labelPad = check.name.padEnd(22);\n if (check.status === \"pass\") {\n success(`${labelPad} ${check.message}`);\n } else if (check.status === \"warn\") {\n warn(`${labelPad} ${check.message}`);\n if (check.fix) {\n for (const line of check.fix.split(\"\\n\")) {\n info(` Fix: ${line}`);\n }\n }\n } else {\n error(`${labelPad} ${check.message}`);\n if (check.fix) {\n for (const line of check.fix.split(\"\\n\")) {\n info(` Fix: ${line}`);\n }\n }\n }\n }\n console.log();\n info(\n `Factory: ${report.passed} passed, ${report.failed} failed, ${report.warnings} warning(s)`\n );\n }\n\n if (failed > 0) {\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { checkUpgrade, performUpgrade } from \"../../engine/upgrader.js\";\nimport { FactoryIdentitySchema } from \"../../engine/schemas.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"../../engine/version.js\";\nimport type { UpgradeCheck, UpgradeResult } from \"../../engine/upgrader.js\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\nimport { regenerateFactoryFiles } from \"../utils/regenerate.js\";\n\nfunction readIdentity(factoryDir: string) {\n const path = join(factoryDir, \".beastmode\", \"factory.json\");\n if (!existsSync(path)) {\n throw new Error(\"No factory.json found. Run beastmode init first.\");\n }\n return FactoryIdentitySchema.parse(JSON.parse(readFileSync(path, \"utf-8\")));\n}\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const path = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(path)) {\n return {};\n }\n return JSON.parse(readFileSync(path, \"utf-8\"));\n}\n\n/**\n * Check if an upgrade is available. Exported for testing.\n */\nexport function upgradeCheckAction(factoryDir: string): UpgradeCheck {\n const identity = readIdentity(factoryDir);\n return checkUpgrade(identity, ENGINE_VERSION, SCHEMA_VERSION);\n}\n\n/**\n * Perform a full upgrade. Exported for testing.\n */\nexport function upgradeAction(factoryDir: string, migrateOnly = false): UpgradeResult {\n const identity = readIdentity(factoryDir);\n const config = readConfig(factoryDir);\n\n const targetVersion = migrateOnly ? identity.engine_version : ENGINE_VERSION;\n const result = performUpgrade(identity, config, targetVersion, SCHEMA_VERSION);\n\n if (result.changes.length > 0) {\n // Write updated factory.json\n writeFileSync(\n join(factoryDir, \".beastmode\", \"factory.json\"),\n JSON.stringify(result.updatedIdentity, null, 2) + \"\\n\"\n );\n\n // Write updated config.json\n writeFileSync(\n join(factoryDir, \".beastmode\", \"config.json\"),\n JSON.stringify(result.updatedConfig, null, 2) + \"\\n\"\n );\n }\n\n return result;\n}\n\nexport const upgradeCommand = new Command(\"upgrade\")\n .description(\"Upgrade engine version and migrate config\")\n .option(\"--check\", \"Check for updates without modifying\")\n .option(\"--migrate-only\", \"Migrate config without bumping engine version\")\n .option(\n \"--files\",\n \"Regenerate .env and docker-compose.yml from current templates while preserving user values (Gap 4). Backs up existing files with a timestamped suffix before writing.\",\n )\n .action((opts) => {\n const factoryDir = resolve(\".\");\n try {\n if (opts.files) {\n header(\"Upgrade: Regenerate factory files\");\n console.log();\n const result = regenerateFactoryFiles(factoryDir);\n\n if (result.missingValues.length > 0) {\n error(\n \"Cannot regenerate — required values missing from existing .env:\",\n );\n for (const key of result.missingValues) {\n error(` ${key}`);\n }\n error(\n \"Fix the .env by hand or re-run 'beastmode init' with the missing values, then try again.\",\n );\n process.exit(1);\n }\n\n if (!result.envChanged && !result.composeChanged) {\n success(\"Already up to date. No files needed regeneration.\");\n return;\n }\n\n if (result.envChanged) {\n info(` .env rewritten (backup: ${result.envBackupPath})`);\n }\n if (result.composeChanged) {\n info(\n ` docker-compose.yml rewritten (backup: ${result.composeBackupPath})`,\n );\n }\n console.log();\n success(\"Factory files regenerated. Run 'beastmode doctor' to verify.\");\n return;\n }\n\n if (opts.check) {\n const check = upgradeCheckAction(factoryDir);\n header(\"Upgrade Check\");\n console.log();\n info(`Current version: ${check.current_version}`);\n info(`Latest version: ${check.latest_version}`);\n info(`Schema: ${check.current_schema} -> ${check.latest_schema}`);\n console.log();\n if (check.update_available) {\n warn(\"Update available. Run: beastmode upgrade\");\n } else {\n success(\"Already up to date.\");\n }\n if (check.migration_needed) {\n warn(\"Config migration needed.\");\n }\n return;\n }\n\n const result = upgradeAction(factoryDir, !!opts.migrateOnly);\n\n header(\"Upgrade\");\n console.log();\n\n if (result.changes.length === 0) {\n success(\"Already up to date. No changes needed.\");\n return;\n }\n\n for (const change of result.changes) {\n info(` ${change}`);\n }\n if (result.migrated) {\n info(\" Config migrated (defaults filled)\");\n }\n console.log();\n success(`Upgraded from ${result.from_version} to ${result.to_version}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","// Regenerate an existing factory's .env and docker-compose.yml against the\n// current templates, preserving user-provided values (PROJECT_DIR, tokens,\n// UI password, optional overrides) and backing up the old files.\n//\n// This is Gap 4 general: factories created before today's generator fixes\n// (Gap 1 PROJECT_DIR drift, Gap 4 claude mount path, Gap 4 .beastmode mount\n// missing) have no way to retroactively pick up those fixes without\n// re-running `init` — which wipes custom knobs. `beastmode upgrade --files`\n// reuses the init template but preserves the values.\n//\n// Values we preserve from the existing .env:\n// - PROJECT_DIR\n// - PROJECT_GITHUB_TOKEN (and its legacy alias GITHUB_TOKEN)\n// - GHCR_PULL_TOKEN\n// - BEASTMODE_UI_PASSWORD\n// - ANTHROPIC_API_KEY (optional, commented by default)\n// - PROJECT_REPO (optional last-resort override)\n// Any other env vars the user added by hand are preserved as-is under a\n// \"# ── Custom ────\" section at the end.\n\nimport { existsSync, readFileSync, writeFileSync, copyFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { generateComposeYaml } from \"./docker.js\";\n\nexport interface ExistingFactoryValues {\n projectDir: string | null;\n projectGithubToken: string | null;\n ghcrPullToken: string | null;\n uiPassword: string | null;\n anthropicApiKey: string | null;\n projectRepoOverride: string | null;\n // Lines the user added that we don't recognize — preserved verbatim under a\n // \"Custom\" section.\n customLines: string[];\n}\n\n// Known keys the regenerator owns. Anything not in this set is treated as a\n// user customization and preserved verbatim.\nconst RECOGNIZED_KEYS = new Set([\n \"PROJECT_DIR\",\n \"PROJECT_GITHUB_TOKEN\",\n \"GITHUB_TOKEN\", // legacy alias — reads mapped to projectGithubToken\n \"GHCR_PULL_TOKEN\",\n \"BEASTMODE_UI_PASSWORD\",\n \"ANTHROPIC_API_KEY\",\n \"PROJECT_REPO\",\n]);\n\n/**\n * Parse an existing .env file and extract the values the regenerator knows\n * about. Unknown lines are collected into customLines so upgrade doesn't\n * silently drop user edits.\n */\nexport function parseExistingEnv(envContent: string): ExistingFactoryValues {\n const values: ExistingFactoryValues = {\n projectDir: null,\n projectGithubToken: null,\n ghcrPullToken: null,\n uiPassword: null,\n anthropicApiKey: null,\n projectRepoOverride: null,\n customLines: [],\n };\n\n // Split on real newlines only; don't touch lines that look like comments\n // or blanks — they're regenerated from the template anyway.\n for (const rawLine of envContent.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n\n // KEY=VALUE — use the first '=' only so values containing '=' survive\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n // Malformed line the user wrote — preserve verbatim\n values.customLines.push(rawLine);\n continue;\n }\n const key = line.slice(0, eq).trim();\n const value = line.slice(eq + 1);\n\n if (!RECOGNIZED_KEYS.has(key)) {\n values.customLines.push(rawLine);\n continue;\n }\n\n switch (key) {\n case \"PROJECT_DIR\":\n values.projectDir = value;\n break;\n case \"PROJECT_GITHUB_TOKEN\":\n values.projectGithubToken = value;\n break;\n case \"GITHUB_TOKEN\":\n // Legacy alias. Only use it if we haven't seen the canonical key yet —\n // PROJECT_GITHUB_TOKEN wins if both are present.\n if (values.projectGithubToken === null) {\n values.projectGithubToken = value;\n }\n break;\n case \"GHCR_PULL_TOKEN\":\n values.ghcrPullToken = value;\n break;\n case \"BEASTMODE_UI_PASSWORD\":\n values.uiPassword = value;\n break;\n case \"ANTHROPIC_API_KEY\":\n values.anthropicApiKey = value;\n break;\n case \"PROJECT_REPO\":\n values.projectRepoOverride = value;\n break;\n }\n }\n\n return values;\n}\n\n/**\n * Build the new .env body from the current template, filling in the values\n * we parsed from the existing file. The template must match init.ts's\n * output exactly (structure, header comments, blank lines) so successive\n * upgrades are idempotent.\n *\n * If any required value is missing from the old .env, the result will have\n * an empty string for that key — the caller should validate BEFORE calling\n * this, and surface a clear remediation message.\n */\nexport function buildNewEnv(values: ExistingFactoryValues): string {\n const lines: string[] = [\n \"# BeastMode environment — DO NOT COMMIT\",\n \"\",\n \"# ── Project credentials (Gap 16 — two-PAT model) ──────────────\",\n \"# PROJECT_GITHUB_TOKEN: used by the daemon and Claude to commit /\",\n \"# push / open PRs / merge / review against the target project repo.\",\n \"# Needs `repo` scope for private repos, `public_repo` for public.\",\n \"# Aliased to GITHUB_TOKEN for backward compat with the gh CLI and\",\n \"# any code that still reads GITHUB_TOKEN.\",\n `PROJECT_GITHUB_TOKEN=${values.projectGithubToken ?? \"\"}`,\n `GITHUB_TOKEN=${values.projectGithubToken ?? \"\"}`,\n \"\",\n \"# GHCR_PULL_TOKEN: used by `docker compose pull` to fetch the\",\n \"# beastmode factory images from ghcr.io/develeap/beastmode/*.\",\n \"# Maintainer-provided (shared across a team) or your own PAT with\",\n \"# `read:packages` scope added. Rotates rarely. May be the same as\",\n \"# PROJECT_GITHUB_TOKEN but is normally a separate dedicated token.\",\n `GHCR_PULL_TOKEN=${values.ghcrPullToken ?? \"\"}`,\n \"\",\n `BEASTMODE_UI_PASSWORD=${values.uiPassword ?? \"\"}`,\n \"\",\n \"# ── Project location ─────────────────────────────────────────\",\n \"# Required. The daemon's git operations target the git remote of\",\n \"# this path. The daemon auto-resolves the github repo from\",\n \"# `git -C $PROJECT_DIR remote get-url origin` at startup.\",\n `PROJECT_DIR=${values.projectDir ?? \"\"}`,\n \"\",\n \"# ── Optional ─────────────────────────────────────────────────\",\n \"# Uncomment for faster direct Anthropic API calls (bypasses the\",\n \"# Claude Code subscription auth via ~/.claude.json).\",\n values.anthropicApiKey !== null\n ? `ANTHROPIC_API_KEY=${values.anthropicApiKey}`\n : \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"\",\n \"# Last-resort override if the daemon's project_repo auto-resolution\",\n \"# (git remote get-url origin) doesn't work for your setup.\",\n \"# The daemon handles this automatically in >99% of cases.\",\n values.projectRepoOverride !== null\n ? `PROJECT_REPO=${values.projectRepoOverride}`\n : \"# PROJECT_REPO=owner/repo\",\n \"\",\n ];\n\n if (values.customLines.length > 0) {\n lines.push(\n \"# ── Custom (preserved verbatim from pre-upgrade .env) ────────\",\n );\n lines.push(...values.customLines);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport interface RegenerateResult {\n envChanged: boolean;\n composeChanged: boolean;\n envBackupPath: string | null;\n composeBackupPath: string | null;\n missingValues: string[]; // keys that were required but absent from old .env\n}\n\n/**\n * Regenerate a factory's .env and docker-compose.yml from current templates,\n * preserving values from the existing files.\n *\n * Idempotent: running twice on the same factory produces no changes on the\n * second run (assuming no generator changes). Each write is preceded by a\n * timestamped backup copy.\n *\n * Does NOT modify files if the existing values are missing required fields —\n * returns the missing list for the caller to surface.\n */\nexport function regenerateFactoryFiles(\n factoryDir: string,\n now: Date = new Date(),\n): RegenerateResult {\n const envPath = join(factoryDir, \".env\");\n const composePath = join(factoryDir, \"docker-compose.yml\");\n\n if (!existsSync(envPath)) {\n throw new Error(\n `.env not found at ${envPath}. This does not look like a beastmode factory — run 'beastmode init' first.`,\n );\n }\n if (!existsSync(composePath)) {\n throw new Error(\n `docker-compose.yml not found at ${composePath}. This does not look like a beastmode factory — run 'beastmode init' first.`,\n );\n }\n\n const existingEnv = readFileSync(envPath, \"utf-8\");\n const values = parseExistingEnv(existingEnv);\n\n // Required values — the daemon won't start without these.\n const missing: string[] = [];\n if (!values.projectDir) missing.push(\"PROJECT_DIR\");\n if (!values.projectGithubToken) missing.push(\"PROJECT_GITHUB_TOKEN\");\n if (!values.ghcrPullToken) missing.push(\"GHCR_PULL_TOKEN\");\n if (!values.uiPassword) missing.push(\"BEASTMODE_UI_PASSWORD\");\n\n if (missing.length > 0) {\n return {\n envChanged: false,\n composeChanged: false,\n envBackupPath: null,\n composeBackupPath: null,\n missingValues: missing,\n };\n }\n\n const newEnv = buildNewEnv(values);\n const newCompose = generateComposeYaml(\"latest\");\n\n const existingCompose = readFileSync(composePath, \"utf-8\");\n\n const envChanged = newEnv !== existingEnv;\n const composeChanged = newCompose !== existingCompose;\n\n if (!envChanged && !composeChanged) {\n return {\n envChanged: false,\n composeChanged: false,\n envBackupPath: null,\n composeBackupPath: null,\n missingValues: [],\n };\n }\n\n const timestamp = now.toISOString().replace(/[:.]/g, \"-\");\n let envBackupPath: string | null = null;\n let composeBackupPath: string | null = null;\n\n if (envChanged) {\n envBackupPath = `${envPath}.backup.${timestamp}`;\n copyFileSync(envPath, envBackupPath);\n writeFileSync(envPath, newEnv, \"utf-8\");\n }\n\n if (composeChanged) {\n composeBackupPath = `${composePath}.backup.${timestamp}`;\n copyFileSync(composePath, composeBackupPath);\n writeFileSync(composePath, newCompose, \"utf-8\");\n }\n\n return {\n envChanged,\n composeChanged,\n envBackupPath,\n composeBackupPath,\n missingValues: [],\n };\n}\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, symlinkSync } from \"fs\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\nimport {\n parseDaemonConfig,\n generateMigration,\n inventoryActiveState,\n type ActiveState,\n type RunCheckpoint,\n} from \"../../engine/migrator.js\";\n\nexport const migrateCommand = new Command(\"migrate\")\n .description(\"Migrate a daemon config into a .beastmode/ factory\")\n .option(\"--config <path>\", \"Path to beastmode.daemon.json\")\n .option(\"--dry-run\", \"Show what would be created without writing files\")\n .action(async (opts) => {\n try {\n await runMigrate(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface MigrateOptions {\n config?: string;\n dryRun?: boolean;\n}\n\nasync function runMigrate(opts: MigrateOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Find daemon config\n const configPath = opts.config\n ? resolve(opts.config)\n : resolve(cwd, \"config\", \"beastmode.daemon.json\");\n\n if (!existsSync(configPath)) {\n throw new Error(\n `Daemon config not found at ${configPath}\\n` +\n \" Use --config <path> to specify a different location.\"\n );\n }\n\n header(\"BeastMode Migrate\");\n info(`Reading daemon config from: ${configPath}`);\n\n // Parse daemon config\n const configContent = readFileSync(configPath, \"utf-8\");\n const daemonConfig = parseDaemonConfig(configContent);\n\n // Inventory active state\n const runsDir = join(cwd, \"runs\");\n let runDirs: string[] = [];\n const checkpoints = new Map<string, RunCheckpoint>();\n\n if (existsSync(runsDir)) {\n const { readdirSync } = await import(\"fs\");\n runDirs = readdirSync(runsDir).filter((d) => {\n try {\n return readdirSync(join(runsDir, d)).length > 0;\n } catch {\n return false;\n }\n });\n\n for (const dir of runDirs) {\n const cpPath = join(runsDir, dir, \"checkpoint.json\");\n if (existsSync(cpPath)) {\n try {\n const cp = JSON.parse(readFileSync(cpPath, \"utf-8\"));\n checkpoints.set(dir, cp);\n } catch {\n // Skip invalid checkpoints\n }\n }\n }\n }\n\n // Get worktree info\n let worktreeOutput = \"\";\n try {\n const { execSync } = await import(\"child_process\");\n worktreeOutput = execSync(\"git worktree list\", {\n cwd,\n encoding: \"utf-8\",\n timeout: 5000,\n });\n } catch {\n // Not a git repo or git not available — fine\n }\n\n const activeState: ActiveState = inventoryActiveState(\n runDirs,\n checkpoints,\n worktreeOutput\n );\n\n // Determine factory name from directory\n const factoryName = cwd.split(\"/\").pop() || \"beastmode-factory\";\n\n // Generate migration\n const { files, report } = generateMigration(\n factoryName,\n daemonConfig,\n activeState\n );\n\n // Report findings\n console.log();\n info(\"Active State:\");\n info(` Runs: ${activeState.totalRuns} total, ${activeState.activeRuns.length} active`);\n info(` Worktrees: ${activeState.worktrees.length}`);\n\n if (activeState.activeRuns.length > 0) {\n warn(\"Active runs detected — they will continue working after migration.\");\n }\n\n console.log();\n info(\"Config Mappings:\");\n for (const mapping of report.configMappings) {\n info(` ${mapping.from} -> ${mapping.to}`);\n }\n\n if (report.droppedKeys.length > 0) {\n console.log();\n info(\"Dropped Keys (daemon-specific):\");\n for (const key of report.droppedKeys) {\n info(` ${key}`);\n }\n }\n\n console.log();\n info(\"Files to create:\");\n for (const file of files) {\n info(` ${file.path}`);\n }\n\n if (opts.dryRun) {\n console.log();\n warn(\"Dry run — no files written.\");\n return;\n }\n\n // Check if factory already exists\n const bmDir = join(cwd, \".beastmode\");\n if (existsSync(bmDir)) {\n throw new Error(\n \"A .beastmode/ directory already exists. Remove it first to re-migrate.\"\n );\n }\n\n // Write files\n for (const file of files) {\n const fullPath = join(cwd, file.path);\n const dir = fullPath.substring(0, fullPath.lastIndexOf(\"/\"));\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, file.content, \"utf-8\");\n }\n\n // Symlink runs/ if it exists\n const runsSymlinkTarget = join(cwd, \"runs\");\n const bmRunsPath = join(cwd, \"runs\"); // runs/ stays at root, same location\n if (existsSync(runsSymlinkTarget)) {\n info(\"Existing runs/ directory preserved in-place.\");\n }\n\n // Create board.json if not already created by migration\n const boardPath = join(bmDir, \"board.json\");\n if (!existsSync(boardPath)) {\n writeFileSync(boardPath, JSON.stringify({ items: [] }, null, 2), \"utf-8\");\n }\n\n // Create .cache directory for bridge\n mkdirSync(join(bmDir, \".cache\"), { recursive: true });\n\n console.log();\n success(\"Migration complete!\");\n info(`Factory created at: ${bmDir}`);\n info(\"Old daemon config preserved at original location.\");\n\n if (report.projectName) {\n info(`Project registered: ${report.projectName}`);\n }\n\n console.log();\n info(\"Next steps:\");\n info(\" beastmode board — launch the board UI\");\n info(\" beastmode deploy — deploy as a systemd service (Linux servers)\");\n info(\" beastmode status — check factory status\");\n info(\" beastmode daemon — start the daemon via bridge\");\n}\n","import { Command } from \"commander\";\nimport { join } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { randomUUID } from \"crypto\";\nimport { header, info, success, warn, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\nimport { generateDaemonConfig, findPythonDaemonPaths, buildDaemonCommand } from \"../../engine/bridge.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"../../engine/schemas.js\";\nimport type { FactoryConfig, ProjectConfig } from \"../../engine/types.js\";\n\nexport const runCommand = new Command(\"run\")\n .description(\"Run a single pipeline task\")\n .argument(\"[project]\", \"Project name (defaults to first project)\")\n .option(\"--task <description>\", \"Task description\")\n .action(async (project, opts) => {\n try {\n await runPipeline(project, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface RunOptions {\n task?: string;\n}\n\nasync function runPipeline(\n projectName: string | undefined,\n opts: RunOptions\n): Promise<void> {\n if (!opts.task) {\n throw new Error(\"Missing required option: --task <description>\");\n }\n\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\n \"No BeastMode factory found. Run 'beastmode init' first.\"\n );\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n header(\"BeastMode Run\");\n\n // Load factory config\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"Factory config not found. Run 'beastmode init' first.\");\n }\n const factoryConfig = FactoryConfigSchema.parse(\n JSON.parse(readFileSync(configPath, \"utf-8\"))\n ) as FactoryConfig;\n\n // Load project config\n let projectConfig: ProjectConfig | null = null;\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n const { readdirSync } = await import(\"fs\");\n const projectFiles = readdirSync(projectsDir).filter((f) =>\n f.endsWith(\".json\")\n );\n\n if (projectName) {\n const file = projectFiles.find(\n (f) => f === `${projectName}.json`\n );\n if (!file) {\n throw new Error(`Project not found: ${projectName}`);\n }\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"))\n ) as ProjectConfig;\n } else if (projectFiles.length > 0) {\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, projectFiles[0]), \"utf-8\"))\n ) as ProjectConfig;\n info(`Using project: ${projectConfig.name}`);\n }\n }\n\n // Create task on the board\n const boardPath = join(bmDir, \"board.json\");\n let boardItems: Array<{\n id: string;\n title: string;\n description: string;\n status: string;\n created_at: string;\n updated_at: string;\n }> = [];\n if (existsSync(boardPath)) {\n try {\n const raw = JSON.parse(readFileSync(boardPath, \"utf-8\"));\n boardItems = Array.isArray(raw.items) ? raw.items : [];\n } catch {\n boardItems = [];\n }\n }\n\n const now = new Date().toISOString();\n const taskId = randomUUID();\n const task = {\n id: taskId,\n title: opts.task,\n description: \"\",\n status: \"ready\",\n created_at: now,\n updated_at: now,\n };\n boardItems.push(task);\n writeFileSync(boardPath, JSON.stringify({ items: boardItems }, null, 2), \"utf-8\");\n info(`Created task: ${task.title} (${taskId})`);\n\n // Generate daemon config\n const cacheDir = join(bmDir, \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n const daemonConfigPath = join(cacheDir, \"daemon.json\");\n const daemonConfig = generateDaemonConfig(factoryConfig, projectConfig, factoryDir);\n writeFileSync(daemonConfigPath, JSON.stringify(daemonConfig, null, 2), \"utf-8\");\n info(`Generated daemon config at: ${daemonConfigPath}`);\n\n // Check for Python\n const { execSync } = await import(\"child_process\");\n let pythonAvailable = false;\n try {\n execSync(\"python --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n } catch {\n try {\n execSync(\"python3 --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n } catch {\n // No Python\n }\n }\n\n if (!pythonAvailable) {\n warn(\"Python not found. Cannot spawn the daemon.\");\n warn(\"The task has been created on the board. Start the daemon manually:\");\n info(` python -m beastmode_daemon --config ${daemonConfigPath}`);\n return;\n }\n\n // Find daemon package\n const envPath = process.env.BEASTMODE_DAEMON_PATH;\n const daemonPaths = findPythonDaemonPaths(envPath, factoryDir);\n let daemonFound = false;\n\n for (const p of daemonPaths) {\n if (existsSync(p)) {\n daemonFound = true;\n break;\n }\n }\n\n if (!daemonFound) {\n warn(\"BeastMode daemon package not found in expected locations.\");\n warn(\"The task has been created on the board. Start the daemon manually:\");\n info(` python -m beastmode_daemon --config ${daemonConfigPath}`);\n return;\n }\n\n // Spawn daemon\n const cmd = buildDaemonCommand(null, daemonConfigPath);\n info(`Spawning daemon: ${cmd.command} ${cmd.args.join(\" \")}`);\n\n const { spawn } = await import(\"child_process\");\n const child = spawn(cmd.command, cmd.args, {\n stdio: \"inherit\",\n cwd: factoryDir,\n env: {\n ...process.env,\n BEASTMODE_ROOT: factoryDir,\n },\n });\n\n // Poll for task completion\n const POLL_INTERVAL = 5000;\n const MAX_POLL_TIME = 3600000; // 1 hour\n const startTime = Date.now();\n\n const pollInterval = setInterval(() => {\n try {\n const board = JSON.parse(readFileSync(boardPath, \"utf-8\"));\n const items = Array.isArray(board.items) ? board.items : [];\n const taskItem = items.find((i: { id: string }) => i.id === taskId);\n\n if (taskItem) {\n const status = taskItem.status;\n if (status === \"done\") {\n clearInterval(pollInterval);\n success(`Task completed: ${opts.task}`);\n child.kill(\"SIGTERM\");\n } else if (status === \"stuck\") {\n clearInterval(pollInterval);\n warn(`Task stuck: ${opts.task}`);\n child.kill(\"SIGTERM\");\n }\n }\n\n if (Date.now() - startTime > MAX_POLL_TIME) {\n clearInterval(pollInterval);\n warn(\"Timeout: task did not complete within 1 hour.\");\n child.kill(\"SIGTERM\");\n }\n } catch {\n // Board file may be locked — retry next interval\n }\n }, POLL_INTERVAL);\n\n // Forward signals\n const signalHandler = (signal: NodeJS.Signals) => {\n clearInterval(pollInterval);\n child.kill(signal);\n };\n process.on(\"SIGINT\", () => signalHandler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => signalHandler(\"SIGTERM\"));\n\n // Wait for child to exit\n await new Promise<void>((resolvePromise) => {\n child.on(\"exit\", (code) => {\n clearInterval(pollInterval);\n if (code !== 0 && code !== null) {\n warn(`Daemon exited with code ${code}`);\n }\n resolvePromise();\n });\n });\n}\n","import { Command } from \"commander\";\nimport { join } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { header, info, success, warn, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\nimport { generateDaemonConfig, buildDaemonCommand } from \"../../engine/bridge.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"../../engine/schemas.js\";\nimport type { FactoryConfig, ProjectConfig } from \"../../engine/types.js\";\n\nexport const daemonCommand = new Command(\"daemon\")\n .description(\"Start the BeastMode daemon via bridge\")\n .option(\"--dry-run\", \"Generate config but don't start daemon\")\n .option(\n \"--log-level <level>\",\n \"Log level (DEBUG, INFO, WARNING, ERROR)\",\n \"INFO\"\n )\n .action(async (opts) => {\n try {\n await runDaemon(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface DaemonOptions {\n dryRun?: boolean;\n logLevel: string;\n}\n\nasync function runDaemon(opts: DaemonOptions): Promise<void> {\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\n \"No BeastMode factory found. Run 'beastmode init' first.\"\n );\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n header(\"BeastMode Daemon\");\n\n // Load factory config\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"Factory config not found. Run 'beastmode init' first.\");\n }\n const factoryConfig = FactoryConfigSchema.parse(\n JSON.parse(readFileSync(configPath, \"utf-8\"))\n ) as FactoryConfig;\n\n // Load first project config (if any)\n let projectConfig: ProjectConfig | null = null;\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n const { readdirSync } = await import(\"fs\");\n const projectFiles = readdirSync(projectsDir).filter((f) =>\n f.endsWith(\".json\")\n );\n if (projectFiles.length > 0) {\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, projectFiles[0]), \"utf-8\"))\n ) as ProjectConfig;\n info(`Using project: ${projectConfig.name}`);\n }\n }\n\n // Generate daemon config\n const cacheDir = join(bmDir, \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n const daemonConfigPath = join(cacheDir, \"daemon.json\");\n const daemonConfig = generateDaemonConfig(\n factoryConfig,\n projectConfig,\n factoryDir\n );\n writeFileSync(\n daemonConfigPath,\n JSON.stringify(daemonConfig, null, 2),\n \"utf-8\"\n );\n info(`Generated daemon config at: ${daemonConfigPath}`);\n\n if (opts.dryRun) {\n console.log();\n info(\"Dry run — daemon config generated but not started.\");\n info(\"Generated config:\");\n console.log(JSON.stringify(daemonConfig, null, 2));\n return;\n }\n\n // Check for Python\n const { execSync } = await import(\"child_process\");\n let pythonCmd = \"python\";\n let pythonAvailable = false;\n\n try {\n execSync(\"python --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n pythonCmd = \"python\";\n } catch {\n try {\n execSync(\"python3 --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n pythonCmd = \"python3\";\n } catch {\n // No Python\n }\n }\n\n if (!pythonAvailable) {\n throw new Error(\n \"Python not found. The BeastMode daemon requires Python 3.10+.\\n\" +\n \"Install Python or set BEASTMODE_DAEMON_PATH to the daemon package.\"\n );\n }\n\n // Build command\n const cmd = buildDaemonCommand(null, daemonConfigPath, {\n dryRun: false,\n logLevel: opts.logLevel,\n });\n\n info(`Starting daemon: ${pythonCmd} ${cmd.args.join(\" \")}`);\n console.log();\n\n // Write PID file (we'll write the child PID after spawn)\n const pidFile = join(bmDir, \"daemon.pid\");\n\n // Spawn daemon\n const { spawn } = await import(\"child_process\");\n const child = spawn(pythonCmd, cmd.args, {\n stdio: \"inherit\",\n cwd: factoryDir,\n env: {\n ...process.env,\n BEASTMODE_ROOT: factoryDir,\n },\n });\n\n // Write PID file\n if (child.pid) {\n writeFileSync(pidFile, String(child.pid), \"utf-8\");\n }\n\n // Forward signals to child\n const signalHandler = (signal: NodeJS.Signals) => {\n info(`Forwarding ${signal} to daemon...`);\n child.kill(signal);\n };\n process.on(\"SIGINT\", () => signalHandler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => signalHandler(\"SIGTERM\"));\n\n // Wait for child to exit\n const exitCode = await new Promise<number>((resolvePromise) => {\n child.on(\"exit\", (code) => {\n // Clean up PID file\n try {\n const { unlinkSync } = require(\"fs\");\n unlinkSync(pidFile);\n } catch {\n // File may not exist\n }\n resolvePromise(code ?? 1);\n });\n });\n\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n}\n","import { Command } from \"commander\";\n\nexport const mcpCommand = new Command(\"mcp\")\n .description(\"Start the BeastMode MCP server (stdio transport)\")\n .action(async () => {\n try {\n const { startMcpServer } = await import(\"../../mcp/index.js\");\n await startMcpServer();\n } catch (err) {\n // Write errors to stderr (stdout is used for MCP protocol)\n process.stderr.write(`BeastMode MCP error: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, writeFileSync, readFileSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { randomBytes } from \"crypto\";\nimport { header, success, error, info, warn } from \"../utils/display.js\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\n\nexport const deployCommand = new Command(\"deploy\")\n .description(\"Deploy BeastMode services as systemd services\")\n .option(\"--port <number>\", \"Port to serve the board UI on\", \"8420\")\n .option(\"--host <host>\", \"Host to bind the board UI to\", \"0.0.0.0\")\n .option(\"--dry-run\", \"Show what would be done without executing\")\n .option(\"--no-start\", \"Install services but don't start them\")\n .option(\"--stop\", \"Stop all 3 BeastMode services\")\n .option(\"--status\", \"Show status of all 3 BeastMode services\")\n .option(\"--cloud <provider>\", \"Deploy to cloud (aws)\")\n .option(\"--upgrade\", \"Update an existing cloud deployment\")\n .option(\"--destroy\", \"Destroy the cloud deployment (delete CloudFormation stack)\")\n .action(async (opts) => {\n try {\n await runDeploy(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface DeployOptions {\n port: string;\n host: string;\n dryRun?: boolean;\n start: boolean; // commander inverts --no-start to start=false\n stop?: boolean;\n status?: boolean;\n cloud?: string;\n upgrade?: boolean;\n destroy?: boolean;\n}\n\nconst SERVICE_NAMES = [\"beastmode-ui\", \"beastmode-board\", \"beastmode\"];\n\nasync function runDeploy(opts: DeployOptions): Promise<void> {\n if (opts.cloud === 'aws') {\n await deployToAWS(opts);\n return;\n }\n\n // Handle --status flag\n if (opts.status) {\n header(\"BeastMode Service Status\");\n for (const name of SERVICE_NAMES) {\n try {\n const out = execSync(`systemctl status ${name} --no-pager 2>&1 || true`, {\n encoding: \"utf-8\",\n shell: \"/bin/bash\",\n });\n console.log(out);\n } catch {\n warn(`Could not get status for ${name}`);\n }\n }\n return;\n }\n\n // Handle --stop flag\n if (opts.stop) {\n header(\"Stopping BeastMode Services\");\n for (const name of SERVICE_NAMES) {\n info(`Stopping ${name}...`);\n try {\n execSync(`sudo systemctl stop ${name}`, { stdio: \"inherit\" });\n success(`${name} stopped`);\n } catch {\n warn(`Could not stop ${name} (may not be running)`);\n }\n }\n return;\n }\n\n header(\"BeastMode Deploy\");\n\n // Check platform\n if (process.platform !== \"linux\") {\n error(\n \"Deploy is only supported on Linux (systemd). For macOS/Windows, run 'beastmode board' directly.\"\n );\n process.exit(1);\n }\n\n // Find factory\n const factoryDir = resolve(\".\");\n const bmDir = join(factoryDir, \".beastmode\");\n if (!existsSync(bmDir)) {\n error(\n \"No .beastmode directory found. Run 'beastmode init' or 'beastmode migrate' first.\"\n );\n process.exit(1);\n }\n\n // Find node and beastmode paths\n let nodePath: string;\n let cliPath: string;\n try {\n nodePath = execSync(\"which node\", { encoding: \"utf-8\" }).trim();\n } catch {\n nodePath = process.execPath;\n }\n\n try {\n cliPath = execSync(\n \"readlink -f $(which beastmode) 2>/dev/null || which beastmode\",\n { encoding: \"utf-8\", shell: \"/bin/bash\" }\n ).trim();\n } catch {\n // Fallback to resolving from __dirname\n cliPath = resolve(\n new URL(\".\", import.meta.url).pathname,\n \"../../index.js\"\n );\n }\n\n // Find Python for board and daemon (prefer venv, fall back to system python3)\n const boardVenvPython = join(factoryDir, \"board\", \".venv\", \"bin\", \"python\");\n const daemonVenvPython = join(factoryDir, \"daemon\", \".venv\", \"bin\", \"python\");\n const boardPython = existsSync(boardVenvPython) ? boardVenvPython : \"python3\";\n const daemonPython = existsSync(daemonVenvPython) ? daemonVenvPython : \"python3\";\n\n const user = execSync(\"whoami\", { encoding: \"utf-8\" }).trim();\n const home = process.env.HOME || `/home/${user}`;\n const port = opts.port;\n const host = opts.host;\n\n // Ensure board UI password is set for remote deployments\n const dotEnv = join(factoryDir, \".env\");\n const secretsEnv = join(bmDir, \"secrets.env.local\");\n const envContent = existsSync(dotEnv) ? readFileSync(dotEnv, \"utf-8\") : \"\";\n const secretsContent = existsSync(secretsEnv) ? readFileSync(secretsEnv, \"utf-8\") : \"\";\n const hasPassword = envContent.includes(\"BEASTMODE_UI_PASSWORD=\") && !envContent.includes(\"BEASTMODE_UI_PASSWORD=\\n\")\n || secretsContent.includes(\"BEASTMODE_UI_PASSWORD=\") && !secretsContent.includes(\"BEASTMODE_UI_PASSWORD=\\n\")\n || !!process.env.BEASTMODE_UI_PASSWORD;\n\n if (!hasPassword && opts.host === \"0.0.0.0\") {\n const generated = randomBytes(18).toString(\"base64url\");\n const target = existsSync(secretsEnv) ? secretsEnv : dotEnv;\n const append = `\\n# Auto-generated board UI password (deploy)\\nBEASTMODE_UI_PASSWORD=${generated}\\n`;\n writeFileSync(target, (existsSync(target) ? readFileSync(target, \"utf-8\") : \"\") + append, \"utf-8\");\n info(`Board UI password auto-generated and saved to ${target}`);\n success(`Password: ${generated}`);\n info(\"Save this password — you'll need it to access the board UI.\");\n }\n\n // Build shared EnvironmentFile lines (same for all 3 services)\n const envFileLines: string[] = [];\n if (existsSync(secretsEnv)) {\n envFileLines.push(`EnvironmentFile=${secretsEnv}`);\n } else {\n envFileLines.push(`# No secrets.env.local found at time of deploy`);\n }\n // Use optional (-) prefix for .env so systemd doesn't fail if it's missing\n envFileLines.push(`EnvironmentFile=-${dotEnv}`);\n\n // ── Service 1: beastmode-ui (Board UI) ──\n const uiServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Board UI\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}`,\n `ExecStart=${nodePath} ${cliPath} board --port ${port} --host ${host}`,\n \"Restart=always\",\n \"RestartSec=5\",\n \"Environment=NODE_ENV=production\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n // ── Service 2: beastmode-board (FastAPI board server) ──\n const boardServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Board API Server\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}/board`,\n `ExecStart=${boardPython} -m uvicorn board_server.app:create_app --factory --host 0.0.0.0 --port 8080`,\n \"Restart=always\",\n \"RestartSec=5\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n // ── Service 3: beastmode (Daemon) ──\n const daemonServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Daemon\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}/daemon`,\n `ExecStart=${daemonPython} -m beastmode_daemon`,\n \"Restart=always\",\n \"RestartSec=5\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n const services: Array<{ name: string; path: string; content: string }> = [\n { name: \"beastmode-ui\", path: \"/etc/systemd/system/beastmode-ui.service\", content: uiServiceContent },\n { name: \"beastmode-board\", path: \"/etc/systemd/system/beastmode-board.service\", content: boardServiceContent },\n { name: \"beastmode\", path: \"/etc/systemd/system/beastmode.service\", content: daemonServiceContent },\n ];\n\n if (opts.dryRun) {\n info(\"Dry run — would create:\");\n for (const svc of services) {\n console.log();\n info(`=== ${svc.name} → ${svc.path} ===`);\n console.log(svc.content);\n }\n info(`Would run: systemctl daemon-reload && systemctl enable/start each service`);\n return;\n }\n\n // Write all 3 service files\n for (const svc of services) {\n info(`Writing service file to ${svc.path}...`);\n try {\n const tmpPath = `/tmp/${svc.name}.service`;\n writeFileSync(tmpPath, svc.content, \"utf-8\");\n execSync(`sudo cp ${tmpPath} ${svc.path}`, { stdio: \"inherit\" });\n success(`${svc.name} service file installed`);\n } catch {\n error(\n `Failed to write service file for ${svc.name}. Run with sudo or manually copy:\\n${svc.content}`\n );\n process.exit(1);\n }\n }\n\n // Reload systemd once after writing all 3\n info(\"Reloading systemd...\");\n execSync(\"sudo systemctl daemon-reload\", { stdio: \"inherit\" });\n success(\"systemd reloaded\");\n\n // Enable and (optionally) start all 3 services\n for (const svc of services) {\n info(`Enabling ${svc.name}...`);\n execSync(`sudo systemctl enable ${svc.name}`, { stdio: \"inherit\" });\n success(`${svc.name} enabled (will start on boot)`);\n\n if (opts.start !== false) {\n info(`Starting ${svc.name}...`);\n execSync(`sudo systemctl restart ${svc.name}`, { stdio: \"inherit\" });\n }\n }\n\n if (opts.start !== false) {\n // Wait briefly then check status of all services\n await new Promise((r) => setTimeout(r, 2000));\n for (const svc of services) {\n try {\n const status = execSync(`systemctl is-active ${svc.name}`, {\n encoding: \"utf-8\",\n }).trim();\n if (status === \"active\") {\n success(`${svc.name} is running`);\n } else {\n warn(`${svc.name} status: ${status}. Check: sudo journalctl -u ${svc.name} -n 20`);\n }\n } catch {\n warn(`Could not verify ${svc.name} status. Check: sudo journalctl -u ${svc.name} -n 20`);\n }\n }\n\n // Show board UI access URL\n try {\n const ip = execSync(\"hostname -I | awk '{print $1}'\", {\n encoding: \"utf-8\",\n shell: \"/bin/bash\",\n }).trim();\n info(`Board UI access at: http://${ip}:${port}/board`);\n } catch {\n info(`Board UI access at: http://<server-ip>:${port}/board`);\n }\n } else {\n info(\"Services installed but not started (--no-start).\");\n for (const svc of services) {\n info(` Start ${svc.name}: sudo systemctl start ${svc.name}`);\n }\n }\n\n console.log();\n success(\"Deployment complete!\");\n for (const svc of services) {\n info(` ${svc.name}:`);\n info(` Status: sudo systemctl status ${svc.name}`);\n info(` Logs: sudo journalctl -u ${svc.name} -f`);\n info(` Restart: sudo systemctl restart ${svc.name}`);\n info(` Stop: sudo systemctl stop ${svc.name}`);\n }\n}\n\nasync function deployToAWS(opts: DeployOptions): Promise<void> {\n if (opts.destroy) {\n header(\"BeastMode Cloud Destroy\");\n\n const stackName = \"beastmode-factory\";\n\n // Confirm\n info(\"This will delete ALL BeastMode cloud resources:\");\n info(\" - EC2 instance (all data on the instance will be lost)\");\n info(\" - Elastic IP\");\n info(\" - Security group\");\n info(\" - IAM role and instance profile\");\n info(\" - SSM parameter (board password)\");\n console.log();\n\n // Check if stack exists\n try {\n execSync(`aws cloudformation describe-stacks --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\"\n });\n } catch {\n error(\"No BeastMode stack found. Nothing to destroy.\");\n return;\n }\n\n info(\"Deleting CloudFormation stack...\");\n try {\n execSync(`aws cloudformation delete-stack --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\"\n });\n success(\"Stack deletion initiated\");\n\n info(\"Waiting for deletion to complete (2-5 minutes)...\");\n execSync(`aws cloudformation wait stack-delete-complete --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\", timeout: 600000\n });\n success(\"BeastMode cloud deployment destroyed.\");\n } catch (e: any) {\n error(`Failed to delete stack: ${e.message || e.stderr || \"unknown error\"}`);\n }\n return;\n }\n\n header(\"BeastMode Cloud Deploy (AWS)\");\n\n // Check prerequisites\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n\n if (!anthropicKey) {\n warn(\"ANTHROPIC_API_KEY not set. The daemon will use Claude Code subscription auth.\");\n warn(\"If you haven't run `claude login` yet, SSH into the instance after deploy and run it.\");\n }\n if (!githubToken) {\n error(\"GITHUB_TOKEN not set in environment\");\n process.exit(1);\n }\n\n // Check AWS CLI\n try {\n execSync(\"aws --version\", { encoding: \"utf-8\" });\n } catch {\n error(\"AWS CLI not found. Install: https://aws.amazon.com/cli/\");\n process.exit(1);\n }\n\n // Check AWS credentials\n try {\n execSync(\"aws sts get-caller-identity\", { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"AWS credentials valid\");\n } catch {\n error(\"AWS credentials not configured. Run: aws configure\");\n process.exit(1);\n }\n\n // Find CloudFormation template\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const templatePath = join(__dirname, \"..\", \"..\", \"infra\", \"cloudformation\", \"beastmode.yaml\");\n // Also check relative to current working directory\n const cwdTemplate = join(process.cwd(), \"infra\", \"cloudformation\", \"beastmode.yaml\");\n const template = existsSync(templatePath) ? templatePath : existsSync(cwdTemplate) ? cwdTemplate : null;\n\n if (!template) {\n error(\"CloudFormation template not found. Expected at infra/cloudformation/beastmode.yaml\");\n process.exit(1);\n }\n\n const stackName = \"beastmode-factory\";\n\n info(\"Creating CloudFormation stack...\");\n\n const params = [\n `ParameterKey=GitHubToken,ParameterValue='${githubToken}'`,\n ];\n if (anthropicKey) {\n params.push(`ParameterKey=AnthropicApiKey,ParameterValue='${anthropicKey}'`);\n }\n\n const createCmd = [\n \"aws cloudformation create-stack\",\n `--stack-name ${stackName}`,\n `--template-body file://${template}`,\n \"--capabilities CAPABILITY_IAM\",\n \"--parameters\",\n ...params,\n ].join(\" \");\n\n if (opts.dryRun) {\n info(\"Dry run — would execute:\");\n console.log(createCmd);\n return;\n }\n\n let isUpdate = false;\n try {\n execSync(createCmd, { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"Stack creation initiated\");\n } catch (e: any) {\n const msg = e.stderr || e.message || \"\";\n if (msg.includes(\"AlreadyExistsException\")) {\n if (opts.upgrade) {\n info(\"Stack exists — updating...\");\n try {\n const updateCmd = createCmd.replace(\"create-stack\", \"update-stack\");\n execSync(updateCmd, { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"Stack update initiated\");\n isUpdate = true;\n } catch (ue: any) {\n const updateMsg = ue.stderr || ue.message || \"\";\n if (updateMsg.includes(\"No updates are to be performed\")) {\n success(\"Stack is already up to date — no changes needed.\");\n // Fall through to show outputs\n } else {\n error(`Failed to update stack: ${updateMsg}`);\n process.exit(1);\n }\n }\n } else {\n warn(\"Stack already exists. Use --upgrade to update it, or delete manually.\");\n process.exit(1);\n }\n } else {\n error(`Failed to create stack: ${msg}`);\n process.exit(1);\n }\n }\n\n // Wait for stack to complete\n const waitAction = isUpdate ? \"update\" : \"create\";\n info(`Waiting for deployment to complete (3-10 minutes)...`);\n\n try {\n execSync(`aws cloudformation wait stack-${waitAction}-complete --stack-name ${stackName}`, {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 900000, // 15 min\n });\n success(`Stack ${waitAction} complete`);\n } catch {\n error(`Stack ${waitAction} timed out or failed. Check AWS CloudFormation console.`);\n process.exit(1);\n }\n\n // Get outputs\n try {\n const outputsJson = execSync(\n `aws cloudformation describe-stacks --stack-name ${stackName} --query 'Stacks[0].Outputs' --output json`,\n { encoding: \"utf-8\", stdio: \"pipe\" }\n );\n const outputs = JSON.parse(outputsJson);\n\n console.log();\n header(\"BeastMode Deployed!\");\n console.log();\n\n for (const output of outputs) {\n info(` ${output.OutputKey}: ${output.OutputValue}`);\n }\n\n // Print password retrieval instructions\n const passwordCmd = outputs.find((o: any) => o.OutputKey === \"PasswordCommand\")?.OutputValue;\n if (passwordCmd) {\n console.log();\n info(\" To retrieve the board password:\");\n info(` ${passwordCmd}`);\n } else {\n console.log();\n info(\" To retrieve the board password:\");\n info(` aws ssm get-parameter --name /beastmode/ui-password --with-decryption --query Parameter.Value --output text`);\n }\n\n console.log();\n info(\"To delete: aws cloudformation delete-stack --stack-name beastmode-factory\");\n } catch {\n warn(\"Stack created but could not retrieve outputs. Check AWS Console.\");\n }\n}\n","import { Command } from \"commander\";\nimport { spawnSync } from \"child_process\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\n\ninterface UpOptions {\n pull?: boolean;\n cwd?: string;\n}\n\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\nconst SYSTEMD_CREDS_TIMER = \"beastmode-claude-creds.timer\";\n\n/** Auto-install the credential sync watcher if it isn't already running.\n *\n * On macOS this is the launchd LaunchAgent; on Linux it's a systemd\n * user timer. Both rely on the same install paths used by\n * ``beastmode init``. The check is best-effort: a missing watcher\n * does not block ``beastmode up`` (the user can still run via\n * ``ANTHROPIC_API_KEY`` or fix it later), so install failures only\n * print a warning. */\nasync function ensureCredWatcher(cwd: string): Promise<void> {\n const plat = process.platform;\n if (plat !== \"darwin\" && plat !== \"linux\") return;\n\n // Cheap probe — `launchctl print` / `systemctl is-active` exits 0\n // when the watcher is already loaded. Skip the install in that case\n // so we don't spam users with messages on every `beastmode up`.\n if (plat === \"darwin\") {\n const uid = process.getuid?.();\n const probe = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (probe.status === 0) return;\n } else {\n const probe = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", SYSTEMD_CREDS_TIMER],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if ((probe.stdout || \"\").trim() === \"active\") return;\n }\n\n info(\"Installing credential sync watcher for Docker daemon...\");\n try {\n if (plat === \"darwin\") {\n const { syncClaudeCredsOnce, installAgent } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Credential sync skipped: ${sync.error}`);\n info(\n \" Run `beastmode sync-claude-creds --install` after `claude login`.\",\n );\n return;\n }\n success(`Credentials synced: ${sync.path}`);\n installAgent(1800, { throwOnError: true, factoryDir: cwd });\n } else {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Credential sync skipped: ${sync.error}`);\n info(\n \" Run `beastmode sync-claude-creds --install` after `claude login`.\",\n );\n return;\n }\n success(`Credentials valid: ${sync.path}`);\n installAgentLinux(1800, { throwOnError: true });\n }\n } catch (e) {\n warn(\n `Credential watcher install failed: ${\n e instanceof Error ? e.message : String(e)\n }`,\n );\n info(\" Service startup continues — re-try with `beastmode sync-claude-creds --install`.\");\n }\n}\n\nexport async function runUp(opts: UpOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n requireComposeFile(cwd);\n\n if (opts.pull) {\n runCompose([\"pull\"], { cwd, inherit: true });\n }\n\n runCompose([\"up\", \"-d\"], { cwd, inherit: true });\n\n // Best-effort credential-watcher install. Runs after services are up\n // so a startup failure here doesn't leave the user with a half-up\n // factory; ANTHROPIC_API_KEY users skip implicitly because the\n // sync routines read the credentials file (which doesn't exist for\n // pure-API-key setups).\n await ensureCredWatcher(cwd);\n}\n\nexport const upCommand = new Command(\"up\")\n .description(\"Start BeastMode services\")\n .option(\"--pull\", \"Pull latest images before starting\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Up\");\n await runUp(opts);\n console.log();\n success(\"BeastMode is running\");\n info(` Board UI: http://localhost:${process.env.UI_PORT || \"8420\"}`);\n info(\" Logs: beastmode logs\");\n info(\" Stop: beastmode down\");\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { header, success, warn, error } from \"../utils/display.js\";\n\ninterface DownOptions {\n volumes?: boolean;\n cwd?: string;\n skipConfirm?: boolean;\n}\n\nexport async function runDown(opts: DownOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n requireComposeFile(cwd);\n\n const args = [\"down\"];\n\n if (opts.volumes) {\n if (!opts.skipConfirm) {\n const { confirm } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"confirm\",\n message: \"This will delete all persistent data (board DB, runs, logs). Continue?\",\n default: false,\n },\n ]);\n if (!confirm) {\n warn(\"Aborted — data preserved\");\n return;\n }\n }\n args.push(\"--volumes\");\n }\n\n runCompose(args, { cwd, inherit: true });\n}\n\nexport const downCommand = new Command(\"down\")\n .description(\"Stop BeastMode services\")\n .option(\"--volumes\", \"Also remove persistent data (board DB, runs, logs)\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Down\");\n await runDown(opts);\n success(\"BeastMode stopped\");\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { error } from \"../utils/display.js\";\n\nconst VALID_SERVICES = [\"board\", \"ui\", \"daemon\"];\n\ninterface LogsOpts {\n service?: string;\n tail?: string;\n}\n\nexport function buildLogsArgs(opts: LogsOpts): string[] {\n const args = [\"logs\", \"-f\", \"--tail\", opts.tail ?? \"100\"];\n\n if (opts.service) {\n if (!VALID_SERVICES.includes(opts.service)) {\n throw new Error(\n `Unknown service \"${opts.service}\". Valid services: ${VALID_SERVICES.join(\", \")}`\n );\n }\n args.push(opts.service);\n }\n\n return args;\n}\n\nexport const logsCommand = new Command(\"logs\")\n .description(\"Stream BeastMode service logs\")\n .argument(\"[service]\", \"Service to show logs for (board, ui, daemon)\")\n .option(\"--tail <n>\", \"Number of lines to show\", \"100\")\n .action(async (service, opts) => {\n try {\n requireComposeFile(process.cwd());\n const args = buildLogsArgs({ service, tail: opts.tail });\n runCompose(args, { inherit: true });\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { requireComposeFile, runCompose, GHCR_IMAGE_PREFIX } from \"../utils/docker.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\n\ninterface UpdateOptions {\n tag?: string;\n cwd?: string;\n}\n\nexport async function runUpdate(opts: UpdateOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n const composePath = requireComposeFile(cwd);\n\n if (opts.tag) {\n // Rewrite image tags in docker-compose.yml\n let content = readFileSync(composePath, \"utf-8\");\n const tagPattern = new RegExp(\n `(${GHCR_IMAGE_PREFIX.replace(/[/]/g, \"\\\\/\")}\\\\/(?:board|daemon|ui)):([\\\\w.\\\\-]+)`,\n \"g\"\n );\n content = content.replace(tagPattern, `$1:${opts.tag}`);\n writeFileSync(composePath, content, \"utf-8\");\n }\n\n runCompose([\"pull\"], { cwd, inherit: true });\n runCompose([\"up\", \"-d\"], { cwd, inherit: true });\n}\n\nexport const updateCommand = new Command(\"update\")\n .description(\"Pull latest BeastMode images and restart\")\n .option(\"--tag <version>\", \"Pin to a specific version (e.g. 1.2.3)\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Update\");\n info(\"Pulling latest images...\");\n await runUpdate(opts);\n console.log();\n success(\"BeastMode updated and restarted\");\n if (opts.tag) {\n info(` Pinned to version: ${opts.tag}`);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { spawn } from \"child_process\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { basename, join, resolve } from \"path\";\nimport { error, header, info, success, warn } from \"../utils/display.js\";\nimport {\n buildRunnerImage,\n detectRunnerStack,\n findLockfiles,\n} from \"../runner-image-builder.js\";\nimport {\n createRegistrationToken,\n deleteRunner,\n listRunners,\n resolveGitHubConfig,\n} from \"../github-runners.js\";\nimport {\n containerIsHealthy,\n findContainerByName,\n pullImageIfNeeded,\n pollUntilOnline,\n removeContainer,\n removeEnvEntries,\n resolveRepoSlug,\n setupStep,\n startRunnerContainer,\n writeEnvEntries,\n writeRunnerMeta,\n} from \"../runner-helpers.js\";\nimport { nativeRunnerSetup } from \"../native-runner.js\";\nimport {\n restoreWorkflows,\n switchWorkflows,\n} from \"../workflow-switcher.js\";\n\nexport const runnerCommand = new Command(\"runner\")\n .description(\"Manage self-hosted GitHub Actions runners\");\n\nexport interface RunnerSetupOpts {\n repo?: string;\n name: string;\n label: string;\n native?: boolean;\n service?: boolean;\n dryRun?: boolean;\n buildImage?: boolean;\n projectDir?: string;\n}\n\n/**\n * Resolve the project name to use as the image-tag prefix. Prefer the\n * registered name in `.beastmode/projects/*.json` whose `path` matches\n * `projectDir`; fall back to the directory's basename so unregistered\n * projects still build a stable, predictable tag.\n */\nexport function resolveProjectName(projectDir: string): string {\n const projectsDir = join(projectDir, \".beastmode\", \"projects\");\n if (existsSync(projectsDir)) {\n try {\n for (const entry of readdirSync(projectsDir)) {\n if (!entry.endsWith(\".json\")) continue;\n const file = join(projectsDir, entry);\n try {\n const raw = readFileSync(file, \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n if (\n typeof data.path === \"string\" &&\n resolve(data.path) === resolve(projectDir) &&\n typeof data.name === \"string\" &&\n data.name.length > 0\n ) {\n return data.name;\n }\n } catch {\n // Corrupt or unreadable project.json — fall through to the\n // next candidate.\n }\n }\n } catch {\n // Directory race / permission error — fall back to basename.\n }\n }\n return basename(resolve(projectDir));\n}\n\nexport async function runnerSetupAction(\n opts: RunnerSetupOpts,\n): Promise<void> {\n if (opts.service !== undefined && !opts.native) {\n throw new Error(\n \"--service requires --native. The Docker runner always runs as a container service.\",\n );\n }\n\n if (opts.buildImage && opts.native) {\n throw new Error(\n \"Custom image builds require Docker mode. --build-image is incompatible with --native.\",\n );\n }\n\n if (opts.native) {\n await nativeRunnerSetup(opts);\n return;\n }\n\n const ghConfig = resolveGitHubConfig();\n const repoSlug = opts.repo ?? resolveRepoSlug();\n\n setupStep(\"Generating registration token via GitHub API...\");\n if (opts.dryRun) {\n info(`[dry-run] Would start container '${opts.name}' for repo ${repoSlug}`);\n return;\n }\n\n const { token: regToken } = await createRegistrationToken(ghConfig);\n\n setupStep(\"Pulling myoung34/github-runner:latest...\");\n await pullImageIfNeeded(\"myoung34/github-runner:latest\");\n\n const existing = await findContainerByName(opts.name);\n if (existing) {\n if (containerIsHealthy(existing)) {\n success(`Runner container '${opts.name}' already running — reusing.`);\n return;\n }\n setupStep(\n `Container '${opts.name}' exists but is dead — removing and recreating...`,\n );\n await removeContainer(opts.name);\n }\n\n const repoUrl = `https://github.com/${ghConfig.owner}/${ghConfig.repo}`;\n setupStep(\"Starting runner container...\");\n await startRunnerContainer({\n name: opts.name,\n repoUrl,\n token: regToken,\n labels: [\"self-hosted\", opts.label],\n });\n\n await writeEnvEntries({\n RUNNER_REPO_URL: repoUrl,\n RUNNER_TOKEN: regToken,\n RUNNER_NAME: opts.name,\n });\n\n setupStep(\"Waiting for runner to appear online on GitHub (timeout 60s)...\");\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n\n if (opts.buildImage) {\n try {\n const projectDir = resolve(opts.projectDir ?? process.cwd());\n const stack = detectRunnerStack(projectDir);\n const lockfiles = findLockfiles(projectDir, stack.name);\n if (lockfiles.length === 0) {\n info(\n `No lockfiles detected for stack \"${stack.name}\" — skipping custom image build.`,\n );\n } else {\n setupStep(\n `Building custom runner image (stack: ${stack.name}, lockfiles: ${lockfiles.join(\", \")})...`,\n );\n const projectName = resolveProjectName(projectDir);\n const result = buildRunnerImage({\n projectDir,\n projectName,\n stack,\n lockfiles,\n });\n setupStep(\n `Restarting container '${opts.name}' on custom image ${result.imageTag}...`,\n );\n await removeContainer(opts.name);\n await startRunnerContainer({\n name: opts.name,\n repoUrl,\n token: regToken,\n labels: [\"self-hosted\", opts.label],\n image: result.imageTag,\n });\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n success(`Runner now using custom image: ${result.imageTag}`);\n }\n } catch (err: any) {\n warn(\n `Custom image build failed — runner staying on base image. Reason: ${\n err?.message ? String(err.message) : String(err)\n }`,\n );\n }\n }\n\n setupStep(\"Adding runner to docker-compose...\");\n await composeUpRunner();\n\n // Write Docker runner metadata so /api/debug/runner can report mode.\n // Lives at .beastmode/runner-meta.json — token-free by design.\n await writeRunnerMeta(\".beastmode\", {\n name: opts.name,\n mode: \"docker\",\n platform: process.platform,\n arch: process.arch,\n service: true,\n installedAt: new Date().toISOString(),\n });\n\n success(`Runner '${opts.name}' registered and online.`);\n}\n\nasync function composeUpRunner(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n \"docker\",\n [\"compose\", \"--profile\", \"runner\", \"up\", \"-d\", \"runner\"],\n { stdio: [\"ignore\", \"inherit\", \"inherit\"] },\n );\n child.on(\"error\", (err) => reject(err));\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else\n reject(\n new Error(\n `docker compose --profile runner up -d runner exited with code ${code}`,\n ),\n );\n });\n });\n}\n\nrunnerCommand\n .command(\"setup\")\n .description(\"Set up a self-hosted GitHub Actions runner (Docker-Linux by default)\")\n .option(\"--repo <owner/repo>\", \"GitHub repo for runner registration\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--label <label>\", \"Additional runner label\", \"beastmode\")\n .option(\"--dry-run\", \"Print what would happen without mutating state\")\n .option(\n \"--native\",\n \"Use native runner binary instead of Docker (downloads actions/runner)\",\n )\n .option(\n \"--service\",\n \"Install as background service (systemd/launchd). Requires --native.\",\n )\n .option(\n \"--build-image\",\n \"Build a custom runner image with pre-installed project dependencies\",\n false,\n )\n .option(\n \"--project-dir <path>\",\n \"Project root used to detect stack for --build-image\",\n process.cwd(),\n )\n .action(async (opts: RunnerSetupOpts) => {\n try {\n await runnerSetupAction(opts);\n } catch (err: any) {\n error(err?.message ? String(err.message) : String(err));\n process.exitCode = 1;\n }\n });\n\nexport interface RunnerStatusOpts {\n name: string;\n json?: boolean;\n}\n\nexport async function runnerStatusAction(\n opts: RunnerStatusOpts,\n): Promise<void> {\n const container = await findContainerByName(opts.name);\n const containerStatus = container ? container.status : null;\n\n let ghRunner:\n | {\n id: number;\n name: string;\n os: string;\n status: string;\n busy: boolean;\n labels: Array<{ name: string }>;\n }\n | null = null;\n let ghError: string | null = null;\n try {\n const ghConfig = resolveGitHubConfig();\n const list = await listRunners(ghConfig);\n ghRunner = list.runners.find((r) => r.name === opts.name) ?? null;\n } catch (err: any) {\n ghError = err?.message ? String(err.message) : String(err);\n }\n\n if (opts.json) {\n const result: Record<string, any> = {\n name: opts.name,\n container: { found: !!container, status: containerStatus },\n };\n if (ghRunner) {\n result.github = {\n registered: true,\n id: ghRunner.id,\n status: ghRunner.status,\n busy: ghRunner.busy,\n os: ghRunner.os,\n labels: ghRunner.labels.map((l) => l.name),\n };\n } else if (ghError) {\n result.github = { registered: null, error: ghError };\n } else {\n result.github = {\n registered: false,\n id: null,\n status: null,\n busy: null,\n os: null,\n labels: [],\n };\n }\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n header(`Runner Status: ${opts.name}`);\n\n if (container && containerIsHealthy(container)) {\n success(`Container: ${container.status}`);\n } else if (container) {\n error(`Container: ${container.status}`);\n } else {\n error(\"Container: not found\");\n }\n\n if (ghRunner) {\n const busySuffix = ghRunner.busy ? \" — busy\" : \"\";\n if (ghRunner.status === \"online\") {\n success(`GitHub: online (id: ${ghRunner.id})${busySuffix}`);\n } else {\n warn(`GitHub: ${ghRunner.status} (id: ${ghRunner.id})${busySuffix}`);\n }\n info(`Labels: ${ghRunner.labels.map((l) => l.name).join(\", \")}`);\n info(`OS: ${ghRunner.os}`);\n info(`Busy: ${ghRunner.busy ? \"yes\" : \"no\"}`);\n } else if (ghError) {\n warn(`GitHub: could not reach API (${ghError})`);\n } else {\n error(\"GitHub: not registered\");\n }\n}\n\nexport interface RunnerRemoveOpts {\n name: string;\n force?: boolean;\n}\n\nexport async function runnerRemoveAction(\n opts: RunnerRemoveOpts,\n): Promise<void> {\n header(`Removing runner: ${opts.name}`);\n\n let ghDeregistrationFailed = false;\n let ghWarning: string | null = null;\n\n try {\n const ghConfig = resolveGitHubConfig();\n const list = await listRunners(ghConfig);\n const runner = list.runners.find((r) => r.name === opts.name);\n\n if (!runner) {\n ghWarning = \"not registered (nothing to deregister)\";\n } else {\n if (runner.busy && !opts.force) {\n warn(`Runner '${opts.name}' is currently busy (running a job).`);\n info(\"Use --force to remove anyway.\");\n return;\n }\n try {\n await deleteRunner(ghConfig, runner.id);\n success(`Deregistered from GitHub (runner id: ${runner.id})`);\n } catch (err: any) {\n ghDeregistrationFailed = true;\n ghWarning = `deregistration failed: ${err?.message ?? String(err)}`;\n }\n }\n } catch (err: any) {\n ghDeregistrationFailed = true;\n ghWarning = err?.message ? String(err.message) : String(err);\n }\n\n if (ghWarning) {\n warn(`GitHub: ${ghWarning}`);\n }\n\n let containerWarning: string | null = null;\n try {\n const container = await findContainerByName(opts.name);\n if (!container) {\n containerWarning = \"not found (nothing to remove)\";\n } else {\n try {\n await removeContainer(opts.name);\n success(\"Container removed\");\n } catch (err: any) {\n containerWarning = err?.message ? String(err.message) : String(err);\n }\n }\n } catch (err: any) {\n containerWarning = err?.message ? String(err.message) : String(err);\n }\n\n if (containerWarning) {\n warn(`Container: ${containerWarning}`);\n }\n\n await removeEnvEntries([\"RUNNER_REPO_URL\", \"RUNNER_TOKEN\", \"RUNNER_NAME\"]);\n success(\".env entries cleaned (RUNNER_REPO_URL, RUNNER_TOKEN, RUNNER_NAME)\");\n\n if (ghDeregistrationFailed) {\n warn(\n `Runner '${opts.name}' partially removed (GitHub deregistration failed).`,\n );\n } else {\n success(`Runner '${opts.name}' fully removed.`);\n }\n}\n\nrunnerCommand\n .command(\"status\")\n .description(\"Show runner status (container + GitHub registration)\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .action(async (opts: RunnerStatusOpts) => {\n try {\n await runnerStatusAction(opts);\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"remove\")\n .description(\"Remove the runner (container + GitHub deregistration)\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--force\", \"Remove even if the runner is busy\")\n .action(async (opts: RunnerRemoveOpts) => {\n try {\n await runnerRemoveAction(opts);\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"switch-workflows\")\n .description(\"Switch workflow runs-on to self-hosted runner\")\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .action(async (opts) => {\n const projectDir = resolve(opts.projectDir);\n try {\n const result = await switchWorkflows(projectDir);\n if (result.alreadySwitched) {\n info(\"Workflows already switched — nothing to do.\");\n return;\n }\n header(\"Switched workflows to self-hosted runner\");\n for (const file of result.files) {\n success(`${file.relativePath}: ${file.jobCount} job(s) switched`);\n }\n info(\"State saved to .beastmode/runner-workflow-state.json\");\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"restore-workflows\")\n .description(\"Restore workflows to original runs-on values\")\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .action(async (opts) => {\n const projectDir = resolve(opts.projectDir);\n try {\n const result = await restoreWorkflows(projectDir);\n if (result.nothingToRestore) {\n info(\"Nothing to restore.\");\n return;\n }\n header(\"Restored workflows to original runs-on values\");\n for (const file of result.files) {\n success(`${file.relativePath}: ${file.jobCount} job(s) restored`);\n }\n info(\"State file removed.\");\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\ninterface RunnerBuildImageOpts {\n projectDir: string;\n force?: boolean;\n dryRun?: boolean;\n}\n\nexport async function runnerBuildImageAction(\n opts: RunnerBuildImageOpts,\n): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n if (!existsSync(projectDir)) {\n throw new Error(`Project directory not found: ${projectDir}`);\n }\n const stack = detectRunnerStack(projectDir);\n const lockfiles = findLockfiles(projectDir, stack.name);\n\n if (lockfiles.length === 0) {\n info(\n `No lockfiles detected for stack \"${stack.name}\" — skipping dependency layer.`,\n );\n return;\n }\n\n const projectName = resolveProjectName(projectDir);\n const result = buildRunnerImage({\n projectDir,\n projectName,\n stack,\n lockfiles,\n force: opts.force,\n dryRun: opts.dryRun,\n });\n\n if (opts.dryRun) {\n header(\"Dry run: Dockerfile\");\n process.stdout.write(result.dockerfile);\n info(`Image would be tagged: ${result.imageTag}`);\n return;\n }\n\n success(\n `Stack detected: ${stack.name} (lockfiles: ${lockfiles.join(\", \")})`,\n );\n if (result.built) {\n success(`Runner image built: ${result.imageTag}`);\n } else {\n info(`Runner image already up-to-date: ${result.imageTag}`);\n }\n info(`Lockfile hash: ${result.lockfileHash}`);\n}\n\nrunnerCommand\n .command(\"build-image\")\n .description(\n \"Build a custom runner image with pre-installed project dependencies\",\n )\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .option(\"--force\", \"Rebuild even if lockfiles unchanged\", false)\n .option(\"--dry-run\", \"Print Dockerfile without building\", false)\n .action(async (opts: RunnerBuildImageOpts) => {\n try {\n await runnerBuildImageAction(opts);\n } catch (err: any) {\n error(err?.message ? String(err.message) : String(err));\n process.exitCode = 1;\n }\n });\n","/**\n * Build a per-project runner image with pre-installed dependency layers.\n *\n * Wraps `docker build` with stack-aware Dockerfile generation. The\n * generated image FROMs `myoung34/github-runner:latest`, layers in the\n * runtime (node/python/go/etc), copies the project's lockfiles, and\n * runs the appropriate dependency install command so subsequent CI\n * jobs skip a cold install.\n *\n * State is persisted to two files inside `.beastmode/runner/`:\n * - `last-build.json` — last successful build's lockfile hash + tag\n * (used by `shouldRebuild` to skip work when nothing changed)\n * - `runner-layers.json` — public observability snapshot consumed by\n * the board's `/api/debug/runner-layers` endpoint\n */\n\nimport { execSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"fs\";\nimport { join } from \"path\";\n\nimport {\n detectRunnerStack,\n findLockfiles,\n RunnerStack,\n} from \"./stack-detect.js\";\n\nexport { detectRunnerStack, findLockfiles };\nexport type { RunnerStack };\n\nexport interface BuildRunnerImageOpts {\n projectDir: string;\n projectName: string;\n stack: RunnerStack;\n lockfiles: string[];\n /** Rebuild even when `last-build.json` has the same lockfile hash. */\n force?: boolean;\n /** Print the Dockerfile + tag without invoking docker. */\n dryRun?: boolean;\n}\n\nexport interface BuildRunnerImageResult {\n imageTag: string;\n lockfileHash: string;\n dockerfile: string;\n built: boolean;\n}\n\nexport interface LastBuild {\n lockfileHash: string;\n imageTag: string;\n builtAt: string;\n}\n\nconst RUNNER_STATE_DIR = \".beastmode/runner\";\nconst LAST_BUILD_FILE = \"last-build.json\";\nconst LAYERS_FILE = \"runner-layers.json\";\n\n/**\n * Map a (stack, lockfile) pair to the install command. The first match\n * wins so callers should pass lockfiles in the canonical preference\n * order returned by `findLockfiles`.\n */\nexport function getDependencyInstallCommand(\n stack: RunnerStack,\n lockfiles: string[],\n): string | null {\n if (lockfiles.length === 0) return null;\n\n const has = (name: string) => lockfiles.includes(name);\n\n if (stack.language === \"node\") {\n if (has(\"pnpm-lock.yaml\")) return \"pnpm install --frozen-lockfile\";\n if (has(\"yarn.lock\")) return \"yarn install --frozen-lockfile\";\n if (has(\"bun.lockb\")) return \"bun install --frozen-lockfile\";\n if (has(\"package-lock.json\")) return \"npm ci\";\n if (has(\"package.json\")) return \"npm install\";\n return null;\n }\n\n if (stack.language === \"python\") {\n if (has(\"poetry.lock\")) return \"poetry install --no-interaction --no-root\";\n if (has(\"uv.lock\")) return \"uv sync --frozen\";\n if (has(\"Pipfile.lock\")) return \"pipenv install --deploy\";\n if (has(\"requirements.txt\")) return \"pip install -r requirements.txt\";\n if (has(\"pyproject.toml\")) return \"pip install .\";\n return null;\n }\n\n if (stack.language === \"go\") {\n if (has(\"go.mod\")) return \"go mod download\";\n return null;\n }\n\n if (stack.language === \"rust\") {\n if (has(\"Cargo.lock\") || has(\"Cargo.toml\")) return \"cargo fetch\";\n return null;\n }\n\n if (stack.language === \"java\") {\n if (stack.name === \"java-maven\" && has(\"pom.xml\")) {\n return \"mvn -B -q dependency:go-offline\";\n }\n if (\n stack.name === \"java-gradle\" &&\n (has(\"build.gradle\") || has(\"build.gradle.kts\"))\n ) {\n return \"./gradlew --no-daemon dependencies || true\";\n }\n return null;\n }\n\n return null;\n}\n\nfunction runtimeInstallBlock(stack: RunnerStack): string {\n switch (stack.language) {\n case \"node\":\n return [\n \"RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \\\\\",\n \" && apt-get install -y --no-install-recommends nodejs \\\\\",\n \" && npm install -g pnpm yarn \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n case \"python\":\n return [\n \"RUN apt-get update \\\\\",\n \" && apt-get install -y --no-install-recommends python3 python3-pip python3-venv \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n case \"go\":\n return [\n \"RUN curl -fsSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \\\\\",\n \" | tar -C /usr/local -xz\",\n \"ENV PATH=\\\"/usr/local/go/bin:${PATH}\\\"\",\n ].join(\"\\n\");\n case \"rust\":\n return [\n \"RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \\\\\",\n \" | sh -s -- -y --default-toolchain stable\",\n \"ENV PATH=\\\"/root/.cargo/bin:${PATH}\\\"\",\n ].join(\"\\n\");\n case \"java\":\n return [\n \"RUN apt-get update \\\\\",\n \" && apt-get install -y --no-install-recommends openjdk-17-jdk-headless maven gradle \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n default:\n return \"# no runtime block for unknown language\";\n }\n}\n\n/**\n * Render a Dockerfile that bakes in the runtime + project dependencies.\n * Pure string output — no I/O. Tested directly.\n */\nexport function generateDockerfile(\n stack: RunnerStack,\n lockfiles: string[],\n): string {\n const lines: string[] = [];\n lines.push(\"FROM myoung34/github-runner:latest\");\n lines.push(\"USER root\");\n lines.push(\"WORKDIR /opt/runner-deps\");\n lines.push(runtimeInstallBlock(stack));\n\n if (lockfiles.length > 0) {\n for (const lf of lockfiles) {\n lines.push(`COPY ${lf} ./${lf}`);\n }\n const installCmd = getDependencyInstallCommand(stack, lockfiles);\n if (installCmd) {\n lines.push(`RUN ${installCmd}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Stable 16-char hex hash of the lockfile contents (sha256 prefix).\n * Used as the image tag and the cache key in `last-build.json`.\n *\n * Files are read in the order supplied; missing files contribute the\n * literal string `<missing>` so a deletion still busts the cache.\n */\nexport function computeLockfileHash(\n projectDir: string,\n lockfiles: string[],\n): string {\n const hash = createHash(\"sha256\");\n for (const lf of lockfiles) {\n const path = join(projectDir, lf);\n hash.update(lf);\n hash.update(\"\\0\");\n if (existsSync(path)) {\n try {\n hash.update(readFileSync(path));\n } catch {\n hash.update(\"<unreadable>\");\n }\n } else {\n hash.update(\"<missing>\");\n }\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Read `last-build.json` for `projectDir`. Returns null when missing or\n * unparseable (corrupt files are treated as cache misses, never errors).\n */\nexport function readLastBuild(projectDir: string): LastBuild | null {\n const path = join(projectDir, RUNNER_STATE_DIR, LAST_BUILD_FILE);\n if (!existsSync(path)) return null;\n try {\n const data = JSON.parse(readFileSync(path, \"utf-8\"));\n if (\n data &&\n typeof data === \"object\" &&\n typeof data.lockfileHash === \"string\" &&\n typeof data.imageTag === \"string\" &&\n typeof data.builtAt === \"string\"\n ) {\n return data as LastBuild;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * True when a rebuild is required. Rebuilds when:\n * - There is no `last-build.json` (first run)\n * - The stored lockfile hash differs from the current one\n * - The file is corrupt or malformed (treated as cache miss)\n */\nexport function shouldRebuild(\n projectDir: string,\n currentHash: string,\n): boolean {\n const last = readLastBuild(projectDir);\n if (!last) return true;\n return last.lockfileHash !== currentHash;\n}\n\nfunction imageTagFor(projectName: string, hash: string): string {\n const safeName = projectName.toLowerCase().replace(/[^a-z0-9_-]/g, \"-\");\n return `beastmode-runner-${safeName}:${hash}`;\n}\n\nfunction writeStateFile(\n projectDir: string,\n fileName: string,\n payload: unknown,\n): void {\n const dir = join(projectDir, RUNNER_STATE_DIR);\n mkdirSync(dir, { recursive: true });\n writeFileSync(\n join(dir, fileName),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\n/**\n * Build (or skip) the runner image and persist the layer metadata.\n *\n * Returns `built: false` when the cached image is still valid and\n * `force` was not requested — the tag is still returned so callers can\n * use it without checking. Throws \"Docker is required for runner\n * image builds\" when `docker build` is not installed.\n */\nexport function buildRunnerImage(\n opts: BuildRunnerImageOpts,\n): BuildRunnerImageResult {\n const { projectDir, projectName, stack, lockfiles, force, dryRun } = opts;\n\n if (!existsSync(projectDir)) {\n throw new Error(`Project directory not found: ${projectDir}`);\n }\n\n const lockfileHash = computeLockfileHash(projectDir, lockfiles);\n const imageTag = imageTagFor(projectName, lockfileHash);\n const dockerfile = generateDockerfile(stack, lockfiles);\n\n if (dryRun) {\n return { imageTag, lockfileHash, dockerfile, built: false };\n }\n\n if (!force && !shouldRebuild(projectDir, lockfileHash)) {\n return { imageTag, lockfileHash, dockerfile, built: false };\n }\n\n try {\n execSync(\n `docker build -t ${imageTag} -f - ${projectDir}`,\n {\n input: dockerfile,\n stdio: [\"pipe\", \"inherit\", \"inherit\"],\n },\n );\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e && e.code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for runner image builds. Install Docker and retry.\",\n );\n }\n const msg = (err as Error)?.message ?? String(err);\n throw new Error(`docker build failed: ${msg}`);\n }\n\n const builtAt = new Date().toISOString();\n writeStateFile(projectDir, LAST_BUILD_FILE, {\n lockfileHash,\n imageTag,\n builtAt,\n } satisfies LastBuild);\n\n writeStateFile(projectDir, LAYERS_FILE, {\n project: projectName,\n stack: stack.name,\n lockfile_hash: lockfileHash,\n image_tag: imageTag,\n lockfiles,\n built_at: builtAt,\n });\n\n return { imageTag, lockfileHash, dockerfile, built: true };\n}\n","/**\n * Runner-image stack detection.\n *\n * Detects the dominant language/framework of a project so the runner image\n * builder can pre-install the right runtime + dependency layers. Distinct\n * from `engine/stack-detector.ts` (which produces a richer StackInfo for\n * scaffolding) — this module is intentionally narrow: name + language +\n * the lockfile globs to copy into the image.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nexport interface RunnerStack {\n /** Identifier — matches the keys used by runner-image-builder. */\n name: string;\n /** Top-level language family used for runtime selection. */\n language: string;\n}\n\nconst NODE_LOCKFILES = [\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n \"bun.lockb\",\n \"package.json\",\n];\n\nconst PYTHON_LOCKFILES = [\n \"poetry.lock\",\n \"uv.lock\",\n \"Pipfile.lock\",\n \"requirements.txt\",\n \"pyproject.toml\",\n];\n\nconst GO_LOCKFILES = [\"go.mod\", \"go.sum\"];\n\nconst RUST_LOCKFILES = [\"Cargo.lock\", \"Cargo.toml\"];\n\nconst JAVA_MAVEN_LOCKFILES = [\"pom.xml\"];\n\nconst JAVA_GRADLE_LOCKFILES = [\n \"build.gradle\",\n \"build.gradle.kts\",\n \"gradle.lockfile\",\n];\n\nconst STACK_LOCKFILES: Record<string, string[]> = {\n nextjs: NODE_LOCKFILES,\n vite: NODE_LOCKFILES,\n react: NODE_LOCKFILES,\n node: NODE_LOCKFILES,\n fastapi: PYTHON_LOCKFILES,\n django: PYTHON_LOCKFILES,\n python: PYTHON_LOCKFILES,\n go: GO_LOCKFILES,\n rust: RUST_LOCKFILES,\n \"java-maven\": JAVA_MAVEN_LOCKFILES,\n \"java-gradle\": JAVA_GRADLE_LOCKFILES,\n};\n\nfunction readFileSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction parseJsonSafe(content: string): Record<string, unknown> | null {\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Identify the project's stack for runner image purposes.\n *\n * Detection order — the first match wins:\n * 1. Node-family via `package.json` (next → nextjs, vite → vite,\n * react-scripts → react, otherwise → node)\n * 2. Python-family (manage.py → django, pyproject.toml mentioning\n * fastapi → fastapi, otherwise pyproject/requirements → python)\n * 3. go.mod → go\n * 4. Cargo.toml → rust\n * 5. pom.xml → java-maven\n * 6. build.gradle{,.kts} → java-gradle\n *\n * Falls back to `node` for empty/unrecognised directories so the runner\n * image still gets a usable JavaScript runtime baseline.\n */\nexport function detectRunnerStack(projectDir: string): RunnerStack {\n const pkgContent = readFileSafe(join(projectDir, \"package.json\"));\n if (pkgContent) {\n const pkg = parseJsonSafe(pkgContent);\n if (pkg) {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n if (deps.next) return { name: \"nextjs\", language: \"node\" };\n if (deps.vite) return { name: \"vite\", language: \"node\" };\n if (deps[\"react-scripts\"]) return { name: \"react\", language: \"node\" };\n }\n return { name: \"node\", language: \"node\" };\n }\n\n if (existsSync(join(projectDir, \"manage.py\"))) {\n return { name: \"django\", language: \"python\" };\n }\n const pyproject = readFileSafe(join(projectDir, \"pyproject.toml\"));\n if (pyproject) {\n if (pyproject.toLowerCase().includes(\"fastapi\")) {\n return { name: \"fastapi\", language: \"python\" };\n }\n return { name: \"python\", language: \"python\" };\n }\n if (existsSync(join(projectDir, \"requirements.txt\"))) {\n return { name: \"python\", language: \"python\" };\n }\n\n if (existsSync(join(projectDir, \"go.mod\"))) {\n return { name: \"go\", language: \"go\" };\n }\n if (existsSync(join(projectDir, \"Cargo.toml\"))) {\n return { name: \"rust\", language: \"rust\" };\n }\n if (existsSync(join(projectDir, \"pom.xml\"))) {\n return { name: \"java-maven\", language: \"java\" };\n }\n if (\n existsSync(join(projectDir, \"build.gradle\")) ||\n existsSync(join(projectDir, \"build.gradle.kts\"))\n ) {\n return { name: \"java-gradle\", language: \"java\" };\n }\n\n return { name: \"node\", language: \"node\" };\n}\n\n/**\n * Return the lockfile candidates that exist on disk for `stackName`.\n *\n * Order is deterministic and follows the canonical preference (e.g. for\n * Node: package-lock → pnpm → yarn → bun → package.json). The image\n * builder hashes this list to invalidate the cached layer when any of\n * the files change.\n */\nexport function findLockfiles(projectDir: string, stackName: string): string[] {\n const candidates = STACK_LOCKFILES[stackName] ?? [];\n return candidates.filter((f) => existsSync(join(projectDir, f)));\n}\n","/**\n * GitHub Actions self-hosted runner API client.\n *\n * Wraps four endpoints from GitHub REST API v3 used to manage self-hosted\n * runners on a repository: create-registration-token, list-runners,\n * get-runner, delete-runner.\n *\n * Token safety: the token is never logged, never embedded in error messages,\n * and never printed to stdout/stderr. The internal `buildHeaders` helper is\n * not exported. Errors strip the API base URL and surface only the path +\n * HTTP status — the auth header is never serialized.\n *\n * Uses Node's native `fetch` (Node >= 20). No new dependencies are added.\n * The client is stateless — no caching, no retries — so retry/backoff is the\n * caller's responsibility in later stories.\n */\n\nexport interface GitHubRunner {\n id: number;\n name: string;\n os: string;\n status: string; // \"online\" | \"offline\"\n busy: boolean;\n labels: Array<{ id: number; name: string; type: string }>;\n}\n\nexport interface GitHubRunnerList {\n total_count: number;\n runners: GitHubRunner[];\n}\n\nexport interface GitHubRegistrationToken {\n token: string;\n expires_at: string; // ISO 8601 timestamp\n}\n\nexport interface GitHubRunnerClientConfig {\n owner: string;\n repo: string;\n token: string; // GitHub PAT — never logged\n}\n\nexport class GitHubRunnerApiError extends Error {\n public readonly status: number;\n public readonly endpoint: string;\n\n constructor(status: number, endpoint: string, message: string) {\n super(message);\n this.name = \"GitHubRunnerApiError\";\n this.status = status;\n this.endpoint = endpoint;\n }\n}\n\nconst GITHUB_API_BASE = \"https://api.github.com\";\n\nfunction buildHeaders(token: string): Record<string, string> {\n return {\n Authorization: `token ${token}`,\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"beastmode-cli\",\n };\n}\n\nfunction runnersUrl(owner: string, repo: string): string {\n return `${GITHUB_API_BASE}/repos/${owner}/${repo}/actions/runners`;\n}\n\nasync function githubFetch<T>(\n url: string,\n token: string,\n method: string = \"GET\",\n body?: unknown,\n): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: buildHeaders(token),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n const endpoint = url.replace(GITHUB_API_BASE, \"\");\n throw new GitHubRunnerApiError(\n resp.status,\n endpoint,\n `GitHub API ${method} ${endpoint} → ${resp.status}: ${text}`,\n );\n }\n\n if (resp.status === 204) return undefined as T;\n\n return (await resp.json()) as T;\n}\n\nexport async function createRegistrationToken(\n config: GitHubRunnerClientConfig,\n): Promise<GitHubRegistrationToken> {\n const url = `${runnersUrl(config.owner, config.repo)}/registration-token`;\n return githubFetch<GitHubRegistrationToken>(url, config.token, \"POST\");\n}\n\nexport async function listRunners(\n config: GitHubRunnerClientConfig,\n): Promise<GitHubRunnerList> {\n const url = runnersUrl(config.owner, config.repo);\n return githubFetch<GitHubRunnerList>(url, config.token);\n}\n\nexport async function getRunner(\n config: GitHubRunnerClientConfig,\n runnerId: number,\n): Promise<GitHubRunner> {\n const url = `${runnersUrl(config.owner, config.repo)}/${runnerId}`;\n return githubFetch<GitHubRunner>(url, config.token);\n}\n\nexport async function deleteRunner(\n config: GitHubRunnerClientConfig,\n runnerId: number,\n): Promise<void> {\n const url = `${runnersUrl(config.owner, config.repo)}/${runnerId}`;\n await githubFetch<void>(url, config.token, \"DELETE\");\n}\n\n/**\n * Build a GitHubRunnerClientConfig from environment variables.\n * Reads GITHUB_TOKEN (falls back to GH_TOKEN) and PROJECT_REPO (\"owner/repo\").\n * Throws Error with an actionable message when either is missing or invalid.\n */\nexport function resolveGitHubConfig(): GitHubRunnerClientConfig {\n const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (!token) {\n throw new Error(\n \"GITHUB_TOKEN (or GH_TOKEN) not set. Add it to .env or export it.\",\n );\n }\n\n const repo = process.env.PROJECT_REPO;\n if (!repo || !repo.includes(\"/\")) {\n throw new Error(\n \"PROJECT_REPO not set or invalid (expected 'owner/repo'). Add it to .env.\",\n );\n }\n\n const [owner, repoName] = repo.split(\"/\", 2);\n return { owner, repo: repoName, token };\n}\n","/**\n * Helpers for `beastmode runner setup` (Story 2 — Docker/Linux path).\n *\n * Lives outside `commands/runner-cmd.ts` so each helper is independently\n * testable without dragging Commander into the test surface.\n *\n * Token safety: the GitHub registration token (RUNNER_TOKEN) flows through\n * `startRunnerContainer` and `writeEnvEntries` but is NEVER passed to the\n * display helpers (info/success/warn/error) or to console.* directly. The\n * docker `run -e RUNNER_TOKEN=...` command line is also never echoed.\n */\n\nimport { execSync, spawn, spawnSync } from \"child_process\";\nimport { promises as fs } from \"fs\";\nimport { join } from \"path\";\nimport {\n GitHubRunnerClientConfig,\n listRunners,\n} from \"./github-runners.js\";\nimport { info } from \"./utils/display.js\";\n\n/**\n * Metadata persisted next to a runner installation so `runner status`\n * (Story 3) and the board's `/api/debug/runner` endpoint can identify\n * mode/platform/service without re-deriving them from process state.\n *\n * Written to:\n * - Native: `~/.beastmode/runners/{name}/runner-meta.json`\n * - Docker: `.beastmode/runner-meta.json`\n */\nexport interface RunnerMeta {\n name: string;\n mode: \"docker\" | \"native\";\n platform: string;\n arch: string;\n installDir?: string;\n service: boolean;\n installedAt: string;\n}\n\n/**\n * Write `runner-meta.json` to the given directory (created if needed).\n * Token-free by design — the schema deliberately excludes\n * RUNNER_TOKEN and any other credentials.\n */\nexport async function writeRunnerMeta(\n dir: string,\n meta: RunnerMeta,\n): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n const path = join(dir, \"runner-meta.json\");\n await fs.writeFile(path, JSON.stringify(meta, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport interface ContainerInfo {\n name: string;\n status: string;\n}\n\nexport interface RunnerStatusResult {\n name: string;\n container: {\n found: boolean;\n status: string | null;\n };\n github: {\n registered: boolean | null;\n id: number | null;\n status: string | null;\n busy: boolean | null;\n os: string | null;\n labels: string[];\n error?: string;\n };\n}\n\n/**\n * Resolve `owner/repo` from the local git remote.\n * Throws when no remote or the URL cannot be parsed.\n */\nexport function resolveRepoSlug(): string {\n let rawUrl: string;\n try {\n rawUrl = execSync(\"git remote get-url origin\", {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n throw new Error(\n \"Could not determine repo from git remote. Use --repo owner/repo.\",\n );\n }\n const match =\n rawUrl.match(/github\\.com[:/](.+?)(?:\\.git)?$/) ||\n rawUrl.match(/github\\.com\\/(.+?)(?:\\.git)?$/);\n if (!match) {\n throw new Error(\n `Could not parse GitHub repo from remote URL: ${rawUrl}`,\n );\n }\n return match[1];\n}\n\n/**\n * Skip if the image is already cached; otherwise stream `docker pull`.\n * Throws an actionable message when docker is not installed.\n */\nexport async function pullImageIfNeeded(image: string): Promise<void> {\n const inspect = spawnSync(\"docker\", [\"image\", \"inspect\", image], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n if (inspect.error && (inspect.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (inspect.status === 0) return;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"docker\", [\"pull\", image], {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n child.on(\"error\", (err) => {\n const e = err as NodeJS.ErrnoException;\n if (e.code === \"ENOENT\") {\n reject(\n new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n ),\n );\n } else {\n reject(err);\n }\n });\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker pull ${image} exited with code ${code}`));\n });\n });\n}\n\n/**\n * Inspect a container by name. Returns null when the container does not exist.\n */\nexport async function findContainerByName(\n name: string,\n): Promise<ContainerInfo | null> {\n const result = spawnSync(\n \"docker\",\n [\"inspect\", name, \"--format\", \"{{.State.Status}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) return null;\n const status = (result.stdout || \"\").trim();\n if (!status) return null;\n return { name, status };\n}\n\nexport function containerIsHealthy(infoArg: ContainerInfo): boolean {\n return infoArg.status === \"running\";\n}\n\nexport async function removeContainer(name: string): Promise<void> {\n const result = spawnSync(\"docker\", [\"rm\", \"-f\", name], {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) {\n throw new Error(\n `docker rm -f ${name} failed (exit ${result.status}): ${result.stderr || \"\"}`,\n );\n }\n}\n\nexport interface StartRunnerOpts {\n name: string;\n repoUrl: string;\n token: string; // registration token — never logged\n labels: string[];\n /** Override the default `myoung34/github-runner:latest` image. */\n image?: string;\n}\n\n/**\n * Start the runner container in detached mode with required env vars.\n * The full command line is never logged (it would expose the token).\n */\nexport async function startRunnerContainer(\n opts: StartRunnerOpts,\n): Promise<void> {\n const labelStr = opts.labels.join(\",\");\n const image = opts.image ?? \"myoung34/github-runner:latest\";\n const args = [\n \"run\",\n \"-d\",\n \"--restart=unless-stopped\",\n \"--name\",\n opts.name,\n \"-e\",\n `REPO_URL=${opts.repoUrl}`,\n \"-e\",\n `RUNNER_TOKEN=${opts.token}`,\n \"-e\",\n `LABELS=${labelStr}`,\n \"-e\",\n `RUNNER_NAME=${opts.name}`,\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock\",\n image,\n ];\n\n const result = spawnSync(\"docker\", args, {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) {\n // Sanitize stderr — strip the token if docker echoed it back.\n const stderr = (result.stderr || \"\").replace(opts.token, \"<REDACTED>\");\n throw new Error(\n `docker run failed (exit ${result.status}): ${stderr}`,\n );\n }\n}\n\n/**\n * Remove `.env` lines whose key matches any of `keys`. No-op if `.env` does\n * not exist. Never reads or logs the values being removed (notably\n * RUNNER_TOKEN). Inverse of `writeEnvEntries`.\n */\nexport async function removeEnvEntries(\n keys: string[],\n envPath: string = \".env\",\n): Promise<void> {\n let existing = \"\";\n try {\n existing = await fs.readFile(envPath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return;\n }\n const lines = existing.split(\"\\n\");\n const filtered = lines.filter(\n (line) => !keys.some((key) => line.startsWith(`${key}=`)),\n );\n await fs.writeFile(envPath, filtered.join(\"\\n\"), \"utf-8\");\n}\n\n/**\n * Read `.env`, replace existing keys, append missing ones, write back.\n * The values (notably RUNNER_TOKEN) are never logged.\n */\nexport async function writeEnvEntries(\n entries: Record<string, string>,\n envPath: string = \".env\",\n): Promise<void> {\n let existing = \"\";\n try {\n existing = await fs.readFile(envPath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n const lines = existing === \"\" ? [] : existing.split(\"\\n\");\n const remainingKeys = new Set(Object.keys(entries));\n\n const updated = lines.map((line) => {\n for (const key of remainingKeys) {\n if (line.startsWith(`${key}=`)) {\n remainingKeys.delete(key);\n return `${key}=${entries[key]}`;\n }\n }\n return line;\n });\n\n for (const key of remainingKeys) {\n updated.push(`${key}=${entries[key]}`);\n }\n\n let output = updated.join(\"\\n\");\n if (existing !== \"\" && !existing.endsWith(\"\\n\") && !output.endsWith(\"\\n\")) {\n output += \"\\n\";\n } else if (existing === \"\" && !output.endsWith(\"\\n\")) {\n output += \"\\n\";\n }\n\n await fs.writeFile(envPath, output, \"utf-8\");\n}\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\n/**\n * Poll `listRunners` every 3s up to `timeoutMs` waiting for the named\n * runner to report status === \"online\". Throws on timeout with a hint.\n */\nexport async function pollUntilOnline(\n config: GitHubRunnerClientConfig,\n name: string,\n timeoutMs: number,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n const list = await listRunners(config);\n const runner = list.runners.find((r) => r.name === name);\n if (runner && runner.status === \"online\") return;\n } catch {\n // transient API errors are tolerated within the timeout window\n }\n if (Date.now() + 3000 >= deadline) break;\n await sleep(3000);\n }\n throw new Error(\n `Runner '${name}' did not appear online within ${Math.floor(\n timeoutMs / 1000,\n )}s — check container logs with: docker logs ${name}`,\n );\n}\n\n/** Tiny step helper — display.ts's `step` takes (n, total, text) which doesn't\n * fit our linear setup flow. We just use info() for narration. */\nexport function setupStep(text: string): void {\n info(text);\n}\n","/**\n * Native runner setup (Story 5).\n *\n * Implements the `--native` and `--native --service` paths for\n * `beastmode runner setup`. The native path downloads the official\n * `actions/runner` binary, configures it against the user's repo, and\n * starts it either in the foreground (default) or as a background\n * service (`--service`): systemd user-service on Linux, launchd user-\n * agent on macOS.\n *\n * Token safety: the GitHub registration token is never logged. The\n * config.sh stderr is sanitized before being included in error\n * messages — see `configureRunner`.\n */\n\nimport {\n execSync,\n spawn,\n spawnSync,\n} from \"child_process\";\nimport {\n createWriteStream,\n existsSync,\n mkdirSync,\n unlinkSync,\n writeFileSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { join, dirname } from \"path\";\nimport { Readable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n createRegistrationToken,\n resolveGitHubConfig,\n} from \"./github-runners.js\";\nimport {\n pollUntilOnline,\n resolveRepoSlug,\n setupStep,\n writeEnvEntries,\n writeRunnerMeta,\n} from \"./runner-helpers.js\";\nimport { header, info, success, warn } from \"./utils/display.js\";\n\n/**\n * Pinned GitHub Actions runner version. Bump manually when a new\n * release is available; the URL pattern is stable across releases.\n */\nexport const RUNNER_VERSION = \"2.322.0\";\n\nexport type RunnerOS = \"linux\" | \"darwin\";\nexport type RunnerArch = \"x64\" | \"arm64\";\n\nexport interface DetectedPlatform {\n os: RunnerOS;\n arch: RunnerArch;\n}\n\n/**\n * Detect the host platform and CPU architecture. Throws with a\n * user-actionable message on Windows or unsupported arches.\n */\nexport function detectPlatform(): DetectedPlatform {\n const platform = process.platform;\n if (platform === \"win32\") {\n throw new Error(\n \"--native is not supported on Windows. Use Docker or WSL.\",\n );\n }\n if (platform !== \"linux\" && platform !== \"darwin\") {\n throw new Error(\n `--native is not supported on ${platform}. Use Docker instead.`,\n );\n }\n\n const arch = process.arch;\n if (arch !== \"x64\" && arch !== \"arm64\") {\n throw new Error(\n `Unsupported architecture: ${arch}. GitHub runners support x64 and arm64.`,\n );\n }\n\n return { os: platform as RunnerOS, arch: arch as RunnerArch };\n}\n\n/**\n * Build the GitHub release download URL. Note: GitHub uses \"osx\", not\n * \"darwin\", in the asset filename — the platform translation is\n * encoded here so callers can pass our internal name.\n */\nexport function runnerDownloadUrl(os: RunnerOS, arch: RunnerArch): string {\n const ghOs = os === \"darwin\" ? \"osx\" : \"linux\";\n return (\n `https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}` +\n `/actions-runner-${ghOs}-${arch}-${RUNNER_VERSION}.tar.gz`\n );\n}\n\n/**\n * Download and extract the runner tarball into `installDir`. On macOS,\n * removes the Gatekeeper quarantine attribute (`xattr -c -r`). Skips\n * the download entirely when `installDir/run.sh` already exists, to\n * satisfy NFR-2 (idempotency).\n */\nexport async function downloadAndExtractRunner(\n installDir: string,\n os: RunnerOS,\n arch: RunnerArch,\n): Promise<void> {\n const runShPath = join(installDir, \"run.sh\");\n if (existsSync(runShPath)) {\n info(\n `Runner binary already present at ${runShPath} — skipping download.`,\n );\n if (os === \"darwin\") {\n // Re-run quarantine removal to be safe on a partially-extracted dir.\n spawnSync(\"xattr\", [\"-c\", \"-r\", installDir], { stdio: \"ignore\" });\n }\n return;\n }\n\n const url = runnerDownloadUrl(os, arch);\n const tarball = join(installDir, \"runner.tar.gz\");\n\n setupStep(\n `Downloading GitHub Actions runner v${RUNNER_VERSION} (${os}/${arch})...`,\n );\n const resp = await fetch(url);\n if (!resp.ok || !resp.body) {\n throw new Error(\n `Failed to download runner: HTTP ${resp.status} from ${url}`,\n );\n }\n await pipeline(\n Readable.fromWeb(resp.body as any),\n createWriteStream(tarball),\n );\n\n setupStep(\"Extracting runner...\");\n try {\n execSync(\"tar -xzf runner.tar.gz\", { cwd: installDir, stdio: \"ignore\" });\n } catch (err: any) {\n throw new Error(\n `Failed to extract runner archive: ${err?.message ?? String(err)}`,\n );\n }\n\n try {\n unlinkSync(tarball);\n } catch {\n // Tarball cleanup is best-effort; the runner is already extracted.\n }\n\n if (os === \"darwin\") {\n setupStep(\"Removing macOS Gatekeeper quarantine attribute...\");\n warn(\n \"macOS Gatekeeper quarantine: running xattr -c -r on runner binaries.\",\n );\n warn(\n \"This is required because macOS quarantines downloaded executables.\",\n );\n spawnSync(\"xattr\", [\"-c\", \"-r\", installDir], { stdio: \"ignore\" });\n }\n}\n\n/**\n * Run `config.sh` with `--unattended --replace`. The token is passed\n * via argv to config.sh but never logged. On failure the token is\n * stripped from the captured stderr before raising.\n */\nexport async function configureRunner(\n installDir: string,\n repoUrl: string,\n token: string,\n name: string,\n labels: string[],\n): Promise<void> {\n setupStep(\"Configuring runner...\");\n const args = [\n \"--url\",\n repoUrl,\n \"--token\",\n token,\n \"--name\",\n name,\n \"--labels\",\n labels.join(\",\"),\n \"--unattended\",\n \"--replace\",\n ];\n const result = spawnSync(join(installDir, \"config.sh\"), args, {\n cwd: installDir,\n stdio: [\"ignore\", \"inherit\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n throw new Error(\n `Runner configuration failed: config.sh not found at ${installDir}/config.sh.`,\n );\n }\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").replace(token, \"<REDACTED>\");\n throw new Error(\n `Runner configuration failed (exit ${result.status}): ${stderr}`,\n );\n }\n}\n\n/**\n * Spawn `run.sh` in the foreground. The spawn is fire-and-forget — the\n * runner stays attached to this terminal and exits when the user hits\n * Ctrl+C or the terminal closes. On macOS we warn that the agent dies\n * with the terminal and recommend `--service`.\n */\nexport function startRunnerForeground(installDir: string): void {\n setupStep(\"Starting runner in foreground mode (Ctrl+C to stop)...\");\n info(\"The runner will stop when this terminal closes.\");\n if (process.platform === \"darwin\") {\n warn(\n \"macOS pitfall: if the terminal session disconnects, the runner dies.\",\n );\n warn(\n \"Use --service to install as a launchd agent for persistent operation.\",\n );\n }\n spawn(join(installDir, \"run.sh\"), [], {\n cwd: installDir,\n stdio: \"inherit\",\n });\n}\n\n/**\n * Render the systemd user unit file. Restart=on-failure auto-recovers\n * a crashed runner; a clean exit (e.g. `runner remove`) does not\n * trigger restart.\n */\nexport function systemdUnitContent(installDir: string, name: string): string {\n return `[Unit]\nDescription=GitHub Actions Runner (${name})\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=${installDir}\nExecStart=${installDir}/run.sh\nRestart=on-failure\nRestartSec=5\nKillSignal=SIGTERM\nTimeoutStopSec=30\n\n[Install]\nWantedBy=default.target\n`;\n}\n\n/**\n * Install and start a systemd user service for the runner.\n * Lives in `~/.config/systemd/user/beastmode-runner-{name}.service`.\n */\nexport async function installSystemdService(\n installDir: string,\n name: string,\n): Promise<void> {\n const unitName = `beastmode-runner-${name}.service`;\n const unitDir = join(homedir(), \".config\", \"systemd\", \"user\");\n mkdirSync(unitDir, { recursive: true });\n writeFileSync(\n join(unitDir, unitName),\n systemdUnitContent(installDir, name),\n \"utf-8\",\n );\n\n try {\n execSync(\"systemctl --user daemon-reload\", { stdio: \"inherit\" });\n execSync(`systemctl --user enable --now ${unitName}`, {\n stdio: \"inherit\",\n });\n } catch (err: any) {\n throw new Error(\n `systemd user-service install failed: ${err?.message ?? String(err)}. ` +\n `Ensure systemd --user is available (some minimal Linux containers don't ship it).`,\n );\n }\n\n success(`Installed and started systemd user service: ${unitName}`);\n info(` Check status: systemctl --user status ${unitName}`);\n info(` View logs: journalctl --user -u ${unitName} -f`);\n}\n\n/**\n * Render the launchd plist for a user agent. Explicit PATH covers\n * `/opt/homebrew/bin` for Apple Silicon Homebrew. RunAtLoad=true and\n * KeepAlive on unsuccessful exit mean the runner restarts after a\n * crash but not after a clean shutdown.\n */\nexport function launchdPlistContent(installDir: string, name: string): string {\n const label = `com.beastmode.runner.${name}`;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${label}</string>\n <key>WorkingDirectory</key>\n <string>${installDir}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${installDir}/run.sh</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>StandardOutPath</key>\n <string>${installDir}/logs/stdout.log</string>\n <key>StandardErrorPath</key>\n <string>${installDir}/logs/stderr.log</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin</string>\n </dict>\n</dict>\n</plist>\n`;\n}\n\n/**\n * Install and load a launchd user agent for the runner. Plist lives\n * at `~/Library/LaunchAgents/com.beastmode.runner.{name}.plist`.\n */\nexport async function installLaunchdService(\n installDir: string,\n name: string,\n): Promise<void> {\n const label = `com.beastmode.runner.${name}`;\n const plistPath = join(\n homedir(),\n \"Library\",\n \"LaunchAgents\",\n `${label}.plist`,\n );\n mkdirSync(dirname(plistPath), { recursive: true });\n mkdirSync(join(installDir, \"logs\"), { recursive: true });\n writeFileSync(plistPath, launchdPlistContent(installDir, name), \"utf-8\");\n\n try {\n execSync(`launchctl load ${plistPath}`, { stdio: \"inherit\" });\n } catch (err: any) {\n throw new Error(\n `launchd agent install failed: ${err?.message ?? String(err)}.`,\n );\n }\n\n success(`Installed and loaded launchd agent: ${label}`);\n info(` Check status: launchctl list | grep ${label}`);\n info(` View logs: tail -f ${installDir}/logs/stdout.log`);\n\n warn(\"macOS pitfall: launchd agents only run while the user is logged in.\");\n warn(\n \"If you reboot without auto-login, the runner won't start until you log in.\",\n );\n warn(\"For headless servers, use a LaunchDaemon (requires root) instead.\");\n}\n\n/**\n * Dispatch to the right service installer for the host OS.\n */\nexport async function installRunnerService(\n installDir: string,\n name: string,\n os: RunnerOS,\n): Promise<void> {\n if (os === \"linux\") {\n await installSystemdService(installDir, name);\n } else {\n await installLaunchdService(installDir, name);\n }\n}\n\nexport interface NativeRunnerSetupOpts {\n repo?: string;\n name: string;\n label: string;\n native?: boolean;\n service?: boolean;\n dryRun?: boolean;\n}\n\n/**\n * Top-level orchestrator for `beastmode runner setup --native`.\n *\n * Flow:\n * detect platform → token → download → configure → write env →\n * write metadata → start (foreground or service) → poll online.\n */\nexport async function nativeRunnerSetup(\n opts: NativeRunnerSetupOpts,\n): Promise<void> {\n if (opts.service !== undefined && !opts.native) {\n throw new Error(\n \"--service requires --native. The Docker runner always runs as a container service.\",\n );\n }\n\n const { os: platformOs, arch } = detectPlatform();\n\n if (platformOs === \"darwin\") {\n header(\"Native Runner Setup (macOS)\");\n warn(\n \"macOS has several pitfalls for self-hosted runners. Read the warnings below carefully.\",\n );\n } else {\n header(\"Native Runner Setup (Linux)\");\n }\n\n const ghConfig = resolveGitHubConfig();\n const repoSlug = opts.repo ?? resolveRepoSlug();\n\n const installDir = join(homedir(), \".beastmode\", \"runners\", opts.name);\n\n if (opts.dryRun) {\n info(\n `[dry-run] Would install native runner '${opts.name}' for repo ${repoSlug}`,\n );\n info(`[dry-run] Platform: ${platformOs}/${arch}`);\n info(`[dry-run] Install dir: ${installDir}`);\n info(`[dry-run] Mode: ${opts.service ? \"service\" : \"foreground\"}`);\n return;\n }\n\n mkdirSync(installDir, { recursive: true });\n\n setupStep(\"Generating registration token via GitHub API...\");\n const { token: regToken } = await createRegistrationToken(ghConfig);\n\n await downloadAndExtractRunner(installDir, platformOs, arch);\n\n const repoUrl = `https://github.com/${ghConfig.owner}/${ghConfig.repo}`;\n await configureRunner(installDir, repoUrl, regToken, opts.name, [\n \"self-hosted\",\n opts.label,\n ]);\n\n await writeEnvEntries({\n RUNNER_REPO_URL: repoUrl,\n RUNNER_TOKEN: regToken,\n RUNNER_NAME: opts.name,\n RUNNER_MODE: \"native\",\n });\n\n await writeRunnerMeta(installDir, {\n name: opts.name,\n mode: \"native\",\n platform: platformOs,\n arch,\n installDir,\n service: opts.service ?? false,\n installedAt: new Date().toISOString(),\n });\n\n if (opts.service) {\n await installRunnerService(installDir, opts.name, platformOs);\n } else {\n startRunnerForeground(installDir);\n }\n\n setupStep(\"Waiting for runner to appear online on GitHub (timeout 60s)...\");\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n success(\n `Runner '${opts.name}' registered and online (native/${platformOs}).`,\n );\n}\n","/**\n * Workflow runs-on switcher for the self-hosted runner workflow.\n *\n * `switchWorkflows()` rewrites every job's `runs-on:` line in the target\n * workflow files to `[self-hosted, beastmode]` and persists the original\n * lines to `.beastmode/runner-workflow-state.json`. `restoreWorkflows()`\n * reads that state and puts the originals back, then deletes the state\n * file. Round-tripping (switch → restore) produces a byte-identical\n * file because the originals are stored as full line text including\n * indentation.\n *\n * Editing is line-by-line with a regex rather than YAML parse/serialize\n * so comments and whitespace survive untouched.\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"fs\";\nimport { dirname, join } from \"path\";\n\nexport const TARGET_LABEL = \"[self-hosted, beastmode]\";\n\nexport const TARGET_WORKFLOWS = [\n \".github/workflows/test.yml\",\n \".github/workflows/dogfood-e2e.yml\",\n];\n\nexport const STATE_FILE = \".beastmode/runner-workflow-state.json\";\n\nexport const RUNS_ON_REGEX = /^(\\s+runs-on:\\s*)(.+)$/;\n\nexport interface WorkflowOriginal {\n line: string;\n}\n\nexport interface WorkflowFileState {\n relativePath: string;\n originals: WorkflowOriginal[];\n}\n\nexport interface WorkflowSwitchState {\n switched_at: string;\n target_label: string;\n files: WorkflowFileState[];\n}\n\nexport interface FileResult {\n relativePath: string;\n jobCount: number;\n}\n\nexport interface SwitchResult {\n alreadySwitched: boolean;\n files: FileResult[];\n}\n\nexport interface RestoreResult {\n nothingToRestore: boolean;\n files: FileResult[];\n}\n\nexport function replaceRunsOn(\n content: string,\n targetLabel: string,\n): { newContent: string; originals: WorkflowOriginal[] } {\n const lines = content.split(\"\\n\");\n const originals: WorkflowOriginal[] = [];\n\n const newLines = lines.map((line) => {\n const match = line.match(RUNS_ON_REGEX);\n if (match) {\n originals.push({ line });\n return `${match[1]}${targetLabel}`;\n }\n return line;\n });\n\n return {\n newContent: newLines.join(\"\\n\"),\n originals,\n };\n}\n\nexport function restoreRunsOn(\n content: string,\n originals: WorkflowOriginal[],\n): string {\n const lines = content.split(\"\\n\");\n let idx = 0;\n\n const newLines = lines.map((line) => {\n const match = line.match(RUNS_ON_REGEX);\n if (match && idx < originals.length) {\n const restored = originals[idx].line;\n idx++;\n return restored;\n }\n return line;\n });\n\n return newLines.join(\"\\n\");\n}\n\nexport async function switchWorkflows(\n projectDir: string,\n): Promise<SwitchResult> {\n const statePath = join(projectDir, STATE_FILE);\n\n if (existsSync(statePath)) {\n return { alreadySwitched: true, files: [] };\n }\n\n const state: WorkflowSwitchState = {\n switched_at: new Date().toISOString(),\n target_label: TARGET_LABEL,\n files: [],\n };\n\n const resultFiles: FileResult[] = [];\n\n for (const relPath of TARGET_WORKFLOWS) {\n const absPath = join(projectDir, relPath);\n if (!existsSync(absPath)) {\n throw new Error(`Workflow file not found: ${relPath}`);\n }\n\n const content = readFileSync(absPath, \"utf-8\");\n const { newContent, originals } = replaceRunsOn(content, TARGET_LABEL);\n\n if (originals.length === 0) {\n throw new Error(`No runs-on found in ${relPath}`);\n }\n\n writeFileSync(absPath, newContent, \"utf-8\");\n\n state.files.push({ relativePath: relPath, originals });\n resultFiles.push({ relativePath: relPath, jobCount: originals.length });\n }\n\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, JSON.stringify(state, null, 2) + \"\\n\", \"utf-8\");\n\n return { alreadySwitched: false, files: resultFiles };\n}\n\nexport async function restoreWorkflows(\n projectDir: string,\n): Promise<RestoreResult> {\n const statePath = join(projectDir, STATE_FILE);\n\n if (!existsSync(statePath)) {\n return { nothingToRestore: true, files: [] };\n }\n\n const state: WorkflowSwitchState = JSON.parse(\n readFileSync(statePath, \"utf-8\"),\n );\n const resultFiles: FileResult[] = [];\n\n for (const fileState of state.files) {\n const absPath = join(projectDir, fileState.relativePath);\n if (!existsSync(absPath)) {\n throw new Error(`Workflow file not found: ${fileState.relativePath}`);\n }\n\n const content = readFileSync(absPath, \"utf-8\");\n const newContent = restoreRunsOn(content, fileState.originals);\n\n writeFileSync(absPath, newContent, \"utf-8\");\n resultFiles.push({\n relativePath: fileState.relativePath,\n jobCount: fileState.originals.length,\n });\n }\n\n unlinkSync(statePath);\n\n return { nothingToRestore: false, files: resultFiles };\n}\n","import { Command } from \"commander\";\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, renameSync, statSync } from \"fs\";\nimport { join, resolve, basename } from \"path\";\nimport { execSync } from \"child_process\";\nimport { detectStack } from \"../../engine/index.js\";\n\nconst DEFAULT_MAX_PROJECTS = 5;\nconst MIN_DISK_WARNING_GB = 10;\n\nfunction countExistingProjects(factoryDir: string): number {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return 0;\n let count = 0;\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n if (existsSync(join(projectsDir, entry, \"project.json\"))) count++;\n else if (entry.endsWith(\".json\")) count++;\n }\n return count;\n}\n\nfunction getMaxProjects(factoryDir: string): number {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (typeof config.max_projects === \"number\") return config.max_projects;\n } catch { /* ignore */ }\n }\n return DEFAULT_MAX_PROJECTS;\n}\n\nfunction getFreeDiskGB(): number | null {\n try {\n // Works on both macOS and Linux\n const output = execSync(\"df -k / | tail -1\", { encoding: \"utf-8\", timeout: 3000 });\n const parts = output.trim().split(/\\s+/);\n const availKB = parseInt(parts[3], 10); // Available in KB\n if (!isNaN(availKB)) return Math.floor(availKB / (1024 * 1024));\n } catch { /* ignore */ }\n return null;\n}\n\nexport function projectAddAction(\n factoryDir: string,\n projectPath: string,\n opts: { name?: string; boardId?: string },\n): void {\n const resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) throw new Error(`Directory not found: ${resolvedPath}`);\n\n const projectName = opts.name || basename(resolvedPath);\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\", projectName);\n\n if (existsSync(projectsDir)) throw new Error(`Project already exists: ${projectName}`);\n\n // Check project limit\n const currentCount = countExistingProjects(factoryDir);\n const maxProjects = getMaxProjects(factoryDir);\n if (currentCount >= maxProjects) {\n throw new Error(\n `Factory has ${currentCount}/${maxProjects} projects. ` +\n `Increase \"max_projects\" in .beastmode/config.json or remove a project with \"beastmode project remove <name>\".`\n );\n }\n\n // Warn about disk space\n const freeGB = getFreeDiskGB();\n if (freeGB !== null && freeGB < MIN_DISK_WARNING_GB) {\n console.warn(\n `Warning: only ${freeGB}GB free disk space. Each project with worktrees may use 1-2GB. Consider freeing space.`\n );\n }\n\n mkdirSync(projectsDir, { recursive: true });\n\n // Detect stack\n let stack: Record<string, unknown> = {};\n try {\n stack = detectStack(resolvedPath) as unknown as Record<string, unknown>;\n } catch { /* ignore */ }\n\n // Assign verify port (scan existing for highest)\n let verifyPort = 3001;\n const allProjectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (existsSync(allProjectsDir)) {\n for (const d of readdirSync(allProjectsDir)) {\n if (d.startsWith(\".\")) continue;\n // Skip the newly created project dir (it has no project.json yet)\n if (d === projectName) continue;\n const pf = join(allProjectsDir, d, \"project.json\");\n if (existsSync(pf)) {\n try {\n const pc = JSON.parse(readFileSync(pf, \"utf-8\"));\n const port = pc?.deploy?.verify_port;\n if (typeof port === \"number\" && port >= verifyPort) verifyPort = port + 1;\n } catch { /* skip */ }\n }\n }\n }\n\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n github: {\n repo: (stack as Record<string, unknown>).git_remote || \"\",\n default_branch: \"main\",\n },\n board: {\n id: opts.boardId ? parseInt(opts.boardId, 10) : null,\n url: \"http://127.0.0.1:8080\",\n auto_created: !opts.boardId,\n },\n deploy: { verify_port: verifyPort },\n pipeline: {},\n models: {},\n slots: { max: null },\n registered_at: new Date().toISOString(),\n };\n\n writeFileSync(join(projectsDir, \"project.json\"), JSON.stringify(projectConfig, null, 2) + \"\\n\");\n writeFileSync(join(projectsDir, \"extensions.json\"), JSON.stringify({\n plugins: { add: [], remove: [] },\n mcps: { add: {}, remove: [] },\n skills: { add: [], remove: [] },\n }, null, 2) + \"\\n\");\n\n // Create runs subdirectory\n const runsDir = join(factoryDir, \"runs\", projectName);\n if (!existsSync(runsDir)) mkdirSync(runsDir, { recursive: true });\n\n // After writing extensions.json, try to create the board\n if (!opts.boardId) {\n void (async () => {\n try {\n const boardUrl = projectConfig.board.url;\n const http = await import(\"http\");\n const postData = JSON.stringify({ project_name: projectName });\n await new Promise<void>((resolve, reject) => {\n const url = new URL(\"/api/boards\", boardUrl);\n const req = http.request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(postData).toString(),\n },\n }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => {\n try {\n const result = JSON.parse(data);\n if (result.created) {\n // Update project.json with the board info\n projectConfig.board.auto_created = true;\n }\n } catch { /* ignore parse errors */ }\n resolve();\n });\n });\n req.on(\"error\", () => resolve()); // Board may not be running — non-fatal\n req.end(postData);\n });\n } catch {\n // Board creation is best-effort — it'll be created on first access anyway\n }\n })();\n }\n}\n\nexport function projectListAction(factoryDir: string): Array<Record<string, unknown>> {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return [];\n return readdirSync(projectsDir)\n .filter((d) => !d.startsWith(\".\") && existsSync(join(projectsDir, d, \"project.json\")))\n .map((d) => {\n try { return JSON.parse(readFileSync(join(projectsDir, d, \"project.json\"), \"utf-8\")); }\n catch { return null; }\n })\n .filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nexport function projectRemoveAction(factoryDir: string, name: string): void {\n const projectDir = join(factoryDir, \".beastmode\", \"projects\", name);\n if (!existsSync(projectDir)) throw new Error(`Project not found: ${name}`);\n const archiveDir = join(factoryDir, \".beastmode\", \"projects\", \".archived\", name);\n mkdirSync(join(factoryDir, \".beastmode\", \"projects\", \".archived\"), { recursive: true });\n renameSync(projectDir, archiveDir);\n}\n\nexport const projectCommand = new Command(\"project\")\n .description(\"Manage projects in this factory\");\n\nprojectCommand\n .command(\"add <path>\")\n .description(\"Register a project\")\n .option(\"--name <name>\", \"Override project name\")\n .option(\"--board-id <id>\", \"Link to existing board ID\")\n .action((path, opts) => {\n const factoryDir = resolve(\".\");\n projectAddAction(factoryDir, path, opts);\n console.log(`Project registered: ${opts.name || basename(resolve(path))}`);\n });\n\nprojectCommand\n .command(\"list\")\n .description(\"List registered projects\")\n .action(() => {\n const projects = projectListAction(resolve(\".\"));\n if (projects.length === 0) { console.log(\"No projects registered.\"); return; }\n for (const p of projects) { console.log(` ${p.name} — ${p.path}`); }\n });\n\nprojectCommand\n .command(\"remove <name>\")\n .description(\"Archive a project\")\n .action((name) => {\n projectRemoveAction(resolve(\".\"), name);\n console.log(`Project archived: ${name}`);\n });\n"],"mappings":"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","names":["existsSync","readFileSync","join","semver","readFileSync","existsSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","dirname","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","existsSync","cpSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","pipeline","mkdirSync","writeFileSync","existsSync","dirname","resolve","existsSync","writeFileSync","existsSync","mkdirSync","readdirSync","readFileSync","statSync","writeFileSync","join","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","unlinkSync","join","dirname","http","resolve","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","statSync","join","getProductDir","execSync","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","statSync","join","resolve","methodology","buildArtifactIndex","spawn","readFileSync","writeFileSync","existsSync","readdirSync","unlinkSync","mkdirSync","statSync","rmSync","join","basename","resolve","dirname","execSync","http","getBoardUrl","deepMerge","poll","seen","allItems","listProducts","loadInception","loadArtifact","listMethodologies","createInceptionState","createEpicsOnBoard","migrateInceptionToSession","listStrategySessions","loadStrategySession","createStrategySession","buildArtifactIndex","loadSessionArtifact","readFileSync","existsSync","join","dirname","fileURLToPath","WebSocketServer","resolve","getBoardUrl","resolve","join","existsSync","readFileSync","mkdirSync","writeFileSync","readdirSync","execSync","url","cmd","out","factoryJsonPath","startServer","Command","execSync","spawnSync","writeFileSync","readFileSync","mkdirSync","existsSync","unlinkSync","join","homedir","result","z","readFileSync","writeFileSync","existsSync","readdirSync","mkdirSync","join","resolve","basename","randomUUID","readJsonFile","init_server","init_server","Command","Command","resolve","basename","join","existsSync","writeFileSync","mkdirSync","readFileSync","existsSync","join","join","Command","readFileSync","resolve","existsSync","startServer","factoryName","basename","projectPath","parseTemplate","actions","syncClaudeCredsOnce","installAgent","syncClaudeCredsLinux","installAgentLinux","join","mkdirSync","writeFileSync","Command","readFileSync","writeFileSync","existsSync","readdirSync","resolve","join","Command","resolve","Command","resolve","Command","resolve","Command","resolve","readFileSync","existsSync","join","Command","readFileSync","writeFileSync","mkdirSync","existsSync","resolve","join","Command","existsSync","readFileSync","readdirSync","execSync","join","resolve","Command","existsSync","readFileSync","writeFileSync","join","resolve","execSync","readConfig","writeConfig","Command","existsSync","readFileSync","readdirSync","join","resolve","execSync","spawnSync","homedir","platform","http","execSync","resolve","http","platform","join","homedir","existsSync","readFileSync","info","join","existsSync","readdirSync","readFileSync","LAUNCH_AGENT_LABEL","homedir","platform","spawnSync","data","Command","resolve","Command","existsSync","readFileSync","writeFileSync","join","resolve","existsSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","readConfig","writeFileSync","Command","resolve","result","Command","resolve","join","existsSync","readFileSync","mkdirSync","writeFileSync","readdirSync","execSync","Command","join","existsSync","readFileSync","writeFileSync","mkdirSync","randomUUID","readdirSync","execSync","spawn","Command","join","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","execSync","spawn","unlinkSync","Command","startMcpServer","Command","resolve","join","existsSync","writeFileSync","readFileSync","execSync","fileURLToPath","dirname","stackName","__filename","__dirname","Command","spawnSync","LAUNCH_AGENT_LABEL","SYSTEMD_CREDS_TIMER","spawnSync","syncClaudeCredsOnce","installAgent","syncClaudeCredsLinux","installAgentLinux","Command","Command","inquirer","inquirer","Command","Command","Command","Command","readFileSync","writeFileSync","readFileSync","writeFileSync","Command","Command","spawn","existsSync","readdirSync","readFileSync","basename","join","resolve","execSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","readFileSync","join","readFileSafe","parseJsonSafe","join","existsSync","readFileSync","mkdirSync","writeFileSync","execSync","execSync","spawnSync","join","join","execSync","spawnSync","resolve","execSync","spawn","spawnSync","existsSync","mkdirSync","unlinkSync","writeFileSync","homedir","join","dirname","platform","join","existsSync","spawnSync","execSync","unlinkSync","spawn","homedir","mkdirSync","writeFileSync","plistPath","dirname","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","dirname","join","Command","join","existsSync","readdirSync","readFileSync","resolve","basename","spawn","Command","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","renameSync","join","resolve","basename","execSync","http","Command"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/schemas.ts","../src/engine/provider-manager.ts","../src/engine/builtin-adapters.ts","../src/engine/import-adapter.ts","../src/engine/export-adapter.ts","../src/engine/stack-detector.ts","../src/engine/presets.ts","../src/engine/default-resolver.ts","../src/engine/secret-validator.ts","../src/engine/version.ts","../src/engine/scaffold-generator.ts","../src/engine/template-importer.ts","../src/engine/config-validator.ts","../src/engine/status-checker.ts","../src/engine/config-manager.ts","../src/engine/doctor.ts","../src/engine/upgrader.ts","../src/engine/plugin-resolver.ts","../src/engine/plugin-registry.ts","../src/engine/mcp-manager.ts","../src/engine/hook-manager.ts","../src/engine/plugin-installer.ts","../src/engine/skill-manager.ts","../src/engine/migrator.ts","../src/engine/bridge.ts","../src/engine/index.ts","../src/cli/utils/file-writer.ts","../src/cli/utils/display.ts","../src/cli/ui/api-routes.ts","../src/cli/ui/archival.ts","../src/cli/ui/inception.ts","../src/cli/ui/strategy.ts","../src/cli/ui/chat-handler.ts","../src/cli/ui/board-api-routes.ts","../src/cli/ui/server.ts","../src/cli/commands/board.ts","../src/cli/commands/sync-claude-creds.ts","../src/mcp/server.ts","../src/mcp/index.ts","../src/index.ts","../src/cli/commands/init.ts","../src/cli/utils/docker.ts","../src/cli/commands/export-config.ts","../src/cli/commands/validate.ts","../src/cli/commands/add.ts","../src/cli/commands/remove.ts","../src/cli/commands/list.ts","../src/cli/commands/import-cmd.ts","../src/cli/commands/status.ts","../src/cli/commands/config-cmd.ts","../src/cli/commands/doctor.ts","../src/cli/commands/upgrade.ts","../src/cli/utils/regenerate.ts","../src/cli/commands/migrate.ts","../src/cli/commands/run.ts","../src/cli/commands/daemon-cmd.ts","../src/cli/commands/mcp-cmd.ts","../src/cli/commands/deploy.ts","../src/cli/commands/up.ts","../src/cli/commands/down.ts","../src/cli/commands/logs-cmd.ts","../src/cli/commands/update.ts","../src/cli/commands/runner-cmd.ts","../src/cli/runner-image-builder.ts","../src/cli/stack-detect.ts","../src/cli/github-runners.ts","../src/cli/runner-helpers.ts","../src/cli/native-runner.ts","../src/cli/workflow-switcher.ts","../src/cli/commands/project-cmd.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const StageConfigSchema = z.object({\n enabled: z.union([z.boolean(), z.literal(\"auto\")]).default(true),\n provider: z.string().default(\"builtin\"),\n});\n\nexport const PipelineConfigSchema = z.object({\n preset: z.enum([\"full\", \"lean\", \"prototype\", \"infra\", \"docs\"]).default(\"full\"),\n stages: z.object({\n spec_refiner: StageConfigSchema.default({}),\n planner: StageConfigSchema.default({}),\n scenario_designer: StageConfigSchema.default({}),\n dtu_builder: StageConfigSchema.default({ enabled: \"auto\" }),\n build_verify_loop: StageConfigSchema.default({}),\n pr_review: StageConfigSchema.default({}),\n prod_verification: StageConfigSchema.default({ enabled: false }),\n }).default({}),\n satisfaction_threshold: z.number().min(0).max(1).default(0.85),\n prod_accept_floor: z.number().min(0).max(1).default(0.65),\n max_iterations: z.number().int().min(1).max(20).default(5),\n fail_fast_threshold: z.number().min(0).max(1).default(0.3),\n});\n\nexport const ModelsConfigSchema = z.object({\n spec: z.string().default(\"claude-opus-4-6\"),\n planner: z.string().default(\"claude-opus-4-6\"),\n coder: z.string().default(\"claude-opus-4-6\"),\n coder_iteration: z.string().default(\"claude-sonnet-4-6\"),\n verifier: z.string().default(\"claude-sonnet-4-6\"),\n reviewer: z.string().default(\"claude-sonnet-4-6\"),\n healing: z.string().default(\"claude-sonnet-4-6\"),\n precheck: z.string().default(\"claude-haiku-4-5\"),\n});\n\nexport const TaskBackendConfigSchema = z.object({\n adapter: z.string().default(\"beastmode-board\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const ResilienceConfigSchema = z.object({\n max_failures: z.number().int().min(1).default(5),\n healing_enabled: z.boolean().default(true),\n healing_max_attempts: z.number().int().min(1).default(3),\n stall_delta: z.number().min(0).max(1).default(0.05),\n stall_window: z.number().int().min(1).default(2),\n});\n\nexport const CostConfigSchema = z.object({\n model_tiering_enabled: z.boolean().default(true),\n incremental_verification: z.boolean().default(true),\n build_check_enabled: z.boolean().default(true),\n});\n\nexport const HumanGatesConfigSchema = z.object({\n spec_approval: z.boolean().default(true),\n epic_approval: z.boolean().default(true),\n pr_review: z.enum([\"automated\", \"human\", \"disabled\"]).default(\"automated\"),\n});\n\nexport const NotificationsConfigSchema = z.object({\n adapter: z.string().default(\"none\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const FactoryConfigSchema = z.object({\n pipeline: PipelineConfigSchema.default({}),\n models: ModelsConfigSchema.default({}),\n task_backend: TaskBackendConfigSchema.default({}),\n resilience: ResilienceConfigSchema.default({}),\n cost: CostConfigSchema.default({}),\n human_gates: HumanGatesConfigSchema.default({}),\n notifications: NotificationsConfigSchema.default({}),\n});\n\nexport const StackConfigSchema = z.object({\n detected: z.string(),\n build_command: z.string(),\n dev_command: z.string(),\n test_command: z.string(),\n install_command: z.string(),\n dev_port: z.number().int().default(3000),\n});\n\nexport const DeployConfigSchema = z.object({\n target: z.string().default(\"pr-only\"),\n config: z.record(z.unknown()).default({}),\n});\n\nexport const ProjectConfigSchema = z.object({\n name: z.string(),\n repo: z.string().optional(),\n path: z.string(),\n stack: StackConfigSchema,\n deploy: DeployConfigSchema.default({}),\n pipeline: z.record(z.unknown()).default({}),\n models: z.record(z.string()).default({}),\n plugins: z.array(z.string()).default([]),\n});\n\nexport const FactoryIdentitySchema = z.object({\n factory_name: z.string(),\n engine_version: z.string(),\n schema_version: z.number().int().default(1),\n created_at: z.string(),\n});\n\n// ── Extension System Schemas ──\n\nexport const HOOK_EVENTS = [\n \"pre-spec\", \"post-spec\",\n \"pre-plan\", \"post-plan\",\n \"pre-build\", \"post-build\",\n \"pre-verify\", \"post-verify\",\n \"pre-ship\", \"post-ship\",\n \"on-convergence\", \"on-failure\", \"on-stuck\",\n] as const;\n\nexport type HookEvent = typeof HOOK_EVENTS[number];\n\nexport const HookEventSchema = z.enum(HOOK_EVENTS);\n\nexport const PluginManifestSchema = z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n description: z.string().min(1),\n engine_version: z.string().min(1),\n stack_match: z.array(z.string()).default([]),\n provides: z.object({\n skills: z.array(z.string()).optional(),\n mcp_servers: z.array(z.string()).optional(),\n hooks: z.array(z.string()).optional(),\n }).default({}),\n dependencies: z.array(z.string()).default([]),\n config_defaults: z.string().optional(),\n});\n\nexport const McpServerEntrySchema = z.object({\n command: z.string().min(1),\n args: z.array(z.string()),\n config: z.record(z.unknown()).default({}),\n source: z.string().min(1),\n enabled: z.boolean().default(true),\n});\n\nexport const HookEntrySchema = z.object({\n name: z.string().min(1),\n command: z.string().optional(),\n skill: z.string().optional(),\n webhook: z.string().optional(),\n config: z.record(z.unknown()).default({}),\n source: z.string().min(1),\n});\n\nexport const RegistryEntrySchema = z.object({\n description: z.string(),\n repo: z.string(),\n versions: z.record(z.object({ ref: z.string() })),\n latest: z.string(),\n});\n\nexport const RegistryIndexSchema = z.object({\n version: z.number().int(),\n plugins: z.record(RegistryEntrySchema),\n});\n\nexport const LockEntrySchema = z.object({\n version: z.string(),\n source: z.string(),\n repo: z.string().optional(),\n ref: z.string().optional(),\n installed_at: z.string(),\n});\n\nexport const ExtensionsLockSchema = z.object({\n plugins: z.record(LockEntrySchema),\n locked_at: z.string(),\n});\n\n// ── Methodology Integration Schemas ──\n\nexport const PIPELINE_STAGES = [\n \"spec_refiner\",\n \"planner\",\n \"scenario_designer\",\n \"coder\",\n \"scenario_runner\",\n \"pr_review\",\n] as const;\n\nexport type PipelineStage = typeof PIPELINE_STAGES[number];\n\nexport const ARTIFACT_TYPES = [\n \"user_intent\",\n \"nlspec.md\",\n \"plan.md\",\n \"scenarios/\",\n \"code_changes\",\n \"satisfaction.json\",\n \"pr_diff\",\n \"review_verdict\",\n] as const;\n\nexport type ArtifactType = typeof ARTIFACT_TYPES[number];\n\nexport const PROVIDER_CONTRACTS: Record<\n typeof PIPELINE_STAGES[number],\n { input: string; output: string }\n> = {\n spec_refiner: { input: \"user_intent\", output: \"nlspec.md\" },\n planner: { input: \"nlspec.md\", output: \"plan.md\" },\n scenario_designer: { input: \"nlspec.md\", output: \"scenarios/\" },\n coder: { input: \"plan.md\", output: \"code_changes\" },\n scenario_runner: { input: \"scenarios/\", output: \"satisfaction.json\" },\n pr_review: { input: \"pr_diff\", output: \"review_verdict\" },\n} as const;\n\nexport const ProviderEntrySchema = z.object({\n name: z.string().min(1),\n skill: z.string().min(1),\n description: z.string().min(1),\n input: z.string().min(1),\n output: z.string().min(1),\n});\n\nexport const ImportAdapterEntrySchema = z.object({\n from_format: z.string().min(1),\n to_artifact: z.string().min(1),\n adapter: z.string().min(1),\n file_patterns: z.array(z.string()).default([\"*.md\"]),\n description: z.string().min(1),\n});\n\nexport const ExportAdapterEntrySchema = z.object({\n from_artifact: z.string().min(1),\n to_format: z.string().min(1),\n adapter: z.string().min(1),\n description: z.string().min(1),\n});\n\nexport const MethodologyPresetEntrySchema = z.object({\n description: z.string().min(1),\n config: z.string().min(1),\n});\n\nexport const MethodologyManifestSchema = z.object({\n name: z.string().min(1),\n methodology: z.string().min(1),\n version: z.string().min(1),\n providers: z.record(ProviderEntrySchema).default({}),\n import_adapters: z.record(ImportAdapterEntrySchema).default({}),\n export_adapters: z.record(ExportAdapterEntrySchema).default({}),\n presets: z.record(MethodologyPresetEntrySchema).default({}),\n});\n","import { PROVIDER_CONTRACTS, PIPELINE_STAGES, MethodologyManifestSchema } from \"./schemas.js\";\nimport type { FactoryConfig, MethodologyManifest } from \"./types.js\";\n\nexport interface BuiltinProviderInfo {\n type: \"builtin\";\n name: \"builtin\";\n stage: string;\n input: string;\n output: string;\n}\n\nexport interface PluginProviderInfo {\n type: \"plugin\";\n name: string;\n stage: string;\n pluginName: string;\n providerName: string;\n input: string;\n output: string;\n}\n\nexport type ProviderInfo = BuiltinProviderInfo | PluginProviderInfo;\n\nexport interface ProviderValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/**\n * Resolve which provider handles a pipeline stage.\n * Pure function — no I/O.\n */\nexport function getStageProvider(\n config: FactoryConfig,\n stage: string\n): ProviderInfo {\n if (!(PIPELINE_STAGES as readonly string[]).includes(stage)) {\n throw new Error(`Unknown pipeline stage: '${stage}'`);\n }\n\n const contract = PROVIDER_CONTRACTS[stage as keyof typeof PROVIDER_CONTRACTS];\n\n // Read the provider field from stage config\n const stageConfig = (config.pipeline.stages as Record<string, { provider?: string }>)[stage];\n const providerName = stageConfig?.provider || \"builtin\";\n\n if (providerName === \"builtin\") {\n return {\n type: \"builtin\",\n name: \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n };\n }\n\n // Plugin provider: format is \"pluginName:providerName\"\n const colonIndex = providerName.indexOf(\":\");\n if (colonIndex === -1) {\n // Treat as builtin if no colon (defensive)\n return {\n type: \"builtin\",\n name: providerName as \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n };\n }\n\n const pluginName = providerName.slice(0, colonIndex);\n const provName = providerName.slice(colonIndex + 1);\n\n return {\n type: \"plugin\",\n name: providerName,\n stage,\n pluginName,\n providerName: provName,\n input: contract.input,\n output: contract.output,\n };\n}\n\n/**\n * Validate that a provider honors the stage contract.\n * For plugin providers, checks the methodology manifest.\n * Pure function — no I/O.\n */\nexport function validateProvider(\n provider: ProviderInfo,\n stage: string,\n manifest?: MethodologyManifest\n): ProviderValidationResult {\n const errors: string[] = [];\n\n if (provider.type === \"builtin\") {\n return { valid: true, errors: [] };\n }\n\n // Plugin provider — need manifest\n if (!manifest) {\n errors.push(\n `Plugin provider '${provider.name}' requires a methodology manifest, but none was provided.`\n );\n return { valid: false, errors };\n }\n\n // Check that the manifest declares a provider for this stage\n const stageProvider = manifest.providers[stage];\n if (!stageProvider) {\n errors.push(\n `Methodology '${manifest.name}' does not provide a provider for stage '${stage}'.`\n );\n return { valid: false, errors };\n }\n\n // Check input contract\n const contract = PROVIDER_CONTRACTS[stage as keyof typeof PROVIDER_CONTRACTS];\n if (stageProvider.input !== contract.input) {\n errors.push(\n `Provider '${provider.name}' declares input '${stageProvider.input}' but stage '${stage}' requires input '${contract.input}'.`\n );\n }\n\n // Check output contract\n if (stageProvider.output !== contract.output) {\n errors.push(\n `Provider '${provider.name}' declares output '${stageProvider.output}' but stage '${stage}' requires output '${contract.output}'.`\n );\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n/**\n * List all available providers: builtins for all stages + any from methodology manifests.\n * Pure function — no I/O.\n */\nexport function listProviders(\n methodologyManifests: MethodologyManifest[]\n): ProviderInfo[] {\n const providers: ProviderInfo[] = [];\n\n // Add builtin providers for all stages\n for (const stage of PIPELINE_STAGES) {\n const contract = PROVIDER_CONTRACTS[stage];\n providers.push({\n type: \"builtin\",\n name: \"builtin\",\n stage,\n input: contract.input,\n output: contract.output,\n });\n }\n\n // Add plugin providers from methodology manifests\n for (const manifest of methodologyManifests) {\n for (const [stage, entry] of Object.entries(manifest.providers)) {\n providers.push({\n type: \"plugin\",\n name: entry.name,\n stage,\n pluginName: manifest.name,\n providerName: entry.name.split(\":\")[1] || entry.name,\n input: entry.input,\n output: entry.output,\n });\n }\n }\n\n return providers;\n}\n\n/**\n * Parse and validate a raw object into a MethodologyManifest.\n * Pure function — no I/O.\n */\nexport function parseMethodologyManifest(raw: unknown): MethodologyManifest {\n if (typeof raw !== \"object\" || raw === null) {\n throw new Error(\"Methodology manifest must be a JSON object\");\n }\n const result = MethodologyManifestSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid methodology manifest:\\n${issues}`);\n }\n return result.data;\n}\n","/**\n * Built-in generic adapters for import/export.\n * All functions are pure — text in, text out. No I/O, no AI calls.\n * These are structural converters that parse common document formats\n * and produce BeastMode artifact formats.\n */\n\n// ── Section Parser Helpers ──\n\ninterface Section {\n heading: string;\n level: number;\n content: string;\n}\n\n/**\n * Parse markdown into sections by heading.\n */\nfunction parseSections(markdown: string): Section[] {\n const lines = markdown.split(\"\\n\");\n const sections: Section[] = [];\n let currentSection: Section | null = null;\n const contentLines: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,6})\\s+(.+)$/);\n if (headingMatch) {\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n contentLines.length = 0;\n }\n currentSection = {\n heading: headingMatch[2].trim(),\n level: headingMatch[1].length,\n content: \"\",\n };\n } else {\n contentLines.push(line);\n }\n }\n\n if (currentSection) {\n currentSection.content = contentLines.join(\"\\n\").trim();\n sections.push(currentSection);\n } else if (contentLines.join(\"\").trim()) {\n // Content with no heading\n sections.push({\n heading: \"\",\n level: 0,\n content: contentLines.join(\"\\n\").trim(),\n });\n }\n\n return sections;\n}\n\n/**\n * Find a section by heading pattern (case-insensitive).\n */\nfunction findSection(sections: Section[], pattern: RegExp): Section | undefined {\n return sections.find((s) => pattern.test(s.heading));\n}\n\n/**\n * Collect all sections matching a pattern.\n */\nfunction findSections(sections: Section[], pattern: RegExp): Section[] {\n return sections.filter((s) => pattern.test(s.heading));\n}\n\n// ── Import: PRD → NLSpec ──\n\n/**\n * Convert a PRD/requirements document to NLSpec format.\n * Extracts: goals, requirements, constraints, API endpoints, data models.\n * Reformats into standard NLSpec section structure.\n */\nexport function importPrd(prdContent: string): string {\n if (!prdContent.trim()) {\n return \"# NLSpec\\n\\n*Imported from PRD (empty source document)*\\n\";\n }\n\n const sections = parseSections(prdContent);\n const output: string[] = [];\n\n // Extract title from first h1 or use generic\n const titleSection = sections.find((s) => s.level === 1);\n const title = titleSection\n ? titleSection.heading.replace(/^(product\\s+)?requirements?\\s+(document|doc)?\\s*[-:.]?\\s*/i, \"\").trim() || \"Imported Spec\"\n : \"Imported Spec\";\n\n output.push(`# NLSpec: ${title}`);\n output.push(\"\");\n\n // Goals → Overview\n const goalsSection = findSection(sections, /goal|objective|overview|purpose|summary/i);\n if (goalsSection) {\n output.push(\"## Overview\");\n output.push(\"\");\n output.push(goalsSection.content);\n output.push(\"\");\n }\n\n // Requirements → Functional Requirements\n const reqSection = findSection(sections, /^requirements?$|functional\\s+requirements?/i);\n if (reqSection) {\n output.push(\"## Functional Requirements\");\n output.push(\"\");\n output.push(reqSection.content);\n output.push(\"\");\n }\n\n // Constraints → Constraints\n const constraintSection = findSection(sections, /constraint|limitation|non.?functional/i);\n if (constraintSection) {\n output.push(\"## Constraints\");\n output.push(\"\");\n output.push(constraintSection.content);\n output.push(\"\");\n }\n\n // API endpoints → API Contracts\n const apiSections = findSections(sections, /api|endpoint|route/i);\n if (apiSections.length > 0) {\n output.push(\"## API Contracts\");\n output.push(\"\");\n for (const section of apiSections) {\n if (section.level > 2) {\n output.push(`### ${section.heading}`);\n }\n if (section.content) {\n output.push(section.content);\n }\n output.push(\"\");\n }\n }\n\n // Data model → Data Structures\n const dataSection = findSection(sections, /data\\s*(model|structure)|schema|database|entit/i);\n if (dataSection) {\n output.push(\"## Data Structures\");\n output.push(\"\");\n output.push(dataSection.content);\n output.push(\"\");\n }\n\n // Remaining uncategorized sections\n const categorized = new Set<Section>();\n if (titleSection) categorized.add(titleSection);\n if (goalsSection) categorized.add(goalsSection);\n if (reqSection) categorized.add(reqSection);\n if (constraintSection) categorized.add(constraintSection);\n for (const s of apiSections) categorized.add(s);\n if (dataSection) categorized.add(dataSection);\n\n const remaining = sections.filter((s) => !categorized.has(s) && s.content.trim());\n if (remaining.length > 0) {\n output.push(\"## Additional Context\");\n output.push(\"\");\n for (const section of remaining) {\n if (section.heading) {\n output.push(`### ${section.heading}`);\n output.push(\"\");\n }\n output.push(section.content);\n output.push(\"\");\n }\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: User Stories → Plan ──\n\n/**\n * Convert a user story list to plan format.\n * Parses \"As a..., I want... so that...\" patterns.\n * Extracts acceptance criteria as task acceptance criteria.\n */\nexport function importUserStories(storiesContent: string): string {\n if (!storiesContent.trim()) {\n return \"# Plan\\n\\n*Imported from user stories (empty source document)*\\n\";\n }\n\n const output: string[] = [];\n output.push(\"# Plan: Imported from User Stories\");\n output.push(\"\");\n\n // Simpler approach: split by \"As a\" / \"As an\" patterns\n const lines = storiesContent.split(\"\\n\");\n const stories: string[] = [];\n let currentStory: string[] = [];\n let inStory = false;\n\n for (const line of lines) {\n const isStoryStart = /^\\s*(?:\\d+\\.\\s*)?(?:#{1,3}\\s*)?As an?\\s+/i.test(line);\n if (isStoryStart) {\n if (inStory && currentStory.length > 0) {\n stories.push(currentStory.join(\"\\n\").trim());\n }\n currentStory = [line];\n inStory = true;\n } else if (inStory) {\n // Non-heading, non-story-start line — part of current story\n if (line.trim() || currentStory.length === 1) {\n currentStory.push(line);\n } else if (!line.trim() && currentStory.length > 1) {\n // Blank line after content — still part of story (for acceptance criteria)\n currentStory.push(line);\n }\n }\n }\n if (inStory && currentStory.length > 0) {\n stories.push(currentStory.join(\"\\n\").trim());\n }\n\n if (stories.length === 0) {\n output.push(\"*No user stories found in source document.*\");\n output.push(\"\");\n return output.join(\"\\n\");\n }\n\n for (let i = 0; i < stories.length; i++) {\n const story = stories[i];\n const storyLines = story.split(\"\\n\");\n const storyLine = storyLines[0].replace(/^\\s*\\d+\\.\\s*/, \"\").replace(/^#{1,3}\\s*/, \"\").trim();\n\n output.push(`## Task ${i + 1}: ${storyLine}`);\n output.push(\"\");\n output.push(`**Story:** ${storyLine}`);\n output.push(\"\");\n\n // Look for acceptance criteria in remaining lines\n const remaining = storyLines.slice(1).join(\"\\n\").trim();\n if (remaining) {\n output.push(`**Acceptance Criteria:**`);\n output.push(remaining);\n output.push(\"\");\n }\n\n output.push(`**Dependencies:** TBD`);\n output.push(\"\");\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: RFC/ADR → NLSpec ──\n\n/**\n * Convert an RFC or ADR document to NLSpec format.\n * Extracts: context, decision, consequences, requirements.\n */\nexport function importRfc(rfcContent: string): string {\n if (!rfcContent.trim()) {\n return \"# NLSpec\\n\\n*Imported from RFC (empty source document)*\\n\";\n }\n\n const sections = parseSections(rfcContent);\n const output: string[] = [];\n\n // Extract title\n const titleSection = sections.find((s) => s.level === 1);\n const title = titleSection\n ? titleSection.heading.replace(/^(RFC|ADR)[-:\\s]*\\d*[-:\\s]*/i, \"\").trim() || \"Imported from RFC\"\n : \"Imported from RFC\";\n\n output.push(`# NLSpec: ${title}`);\n output.push(\"\");\n\n // Context / Problem → Context\n const contextSection = findSection(sections, /context|problem|background|motivation/i);\n if (contextSection) {\n output.push(\"## Context\");\n output.push(\"\");\n output.push(contextSection.content);\n output.push(\"\");\n }\n\n // Decision → Overview\n const decisionSection = findSection(sections, /decision|solution|approach|proposal/i);\n if (decisionSection) {\n output.push(\"## Overview\");\n output.push(\"\");\n output.push(decisionSection.content);\n output.push(\"\");\n }\n\n // Requirements → Functional Requirements\n const reqSection = findSection(sections, /requirement|specification|feature/i);\n if (reqSection) {\n output.push(\"## Functional Requirements\");\n output.push(\"\");\n output.push(reqSection.content);\n output.push(\"\");\n }\n\n // Consequences / Impact → Constraints\n const consequencesSection = findSection(sections, /consequence|impact|trade.?off|risk/i);\n if (consequencesSection) {\n output.push(\"## Constraints\");\n output.push(\"\");\n output.push(consequencesSection.content);\n output.push(\"\");\n }\n\n // Status\n const statusSection = findSection(sections, /status/i);\n if (statusSection) {\n output.push(\"## Status\");\n output.push(\"\");\n output.push(statusSection.content);\n output.push(\"\");\n }\n\n // Remaining sections\n const categorized = new Set<Section>();\n if (titleSection) categorized.add(titleSection);\n if (contextSection) categorized.add(contextSection);\n if (decisionSection) categorized.add(decisionSection);\n if (reqSection) categorized.add(reqSection);\n if (consequencesSection) categorized.add(consequencesSection);\n if (statusSection) categorized.add(statusSection);\n\n const remaining = sections.filter((s) => !categorized.has(s) && s.content.trim());\n if (remaining.length > 0) {\n output.push(\"## Additional Context\");\n output.push(\"\");\n for (const section of remaining) {\n if (section.heading) {\n output.push(`### ${section.heading}`);\n output.push(\"\");\n }\n output.push(section.content);\n output.push(\"\");\n }\n }\n\n return output.join(\"\\n\").trim() + \"\\n\";\n}\n\n// ── Import: Test Cases → Scenarios ──\n\ninterface ScenarioFile {\n name: string;\n content: string;\n}\n\n/**\n * Convert manual test cases to BeastMode scenario format.\n * Returns a JSON string of ScenarioFile[] (array of {name, content}).\n * Each test case becomes one scenario file.\n */\nexport function importTestCases(testCasesContent: string): string {\n if (!testCasesContent.trim()) {\n return \"[]\";\n }\n\n const sections = parseSections(testCasesContent);\n const scenarios: ScenarioFile[] = [];\n\n // Find test case sections (## TC-XXX: or ## Test Case N: or similar)\n const tcSections = sections.filter(\n (s) => s.level >= 2 && /^(TC[-\\s]?\\d+|Test\\s*Case\\s*\\d+)/i.test(s.heading)\n );\n\n // If no TC-pattern sections found, try any h2 sections that look like test cases\n const candidateSections = tcSections.length > 0\n ? tcSections\n : sections.filter((s) => s.level === 2 && s.content.trim());\n\n for (const section of candidateSections) {\n const name = section.heading\n .replace(/[^a-zA-Z0-9\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\");\n\n const scenarioContent: string[] = [];\n const heading = section.heading;\n scenarioContent.push(`# Scenario: ${heading}`);\n scenarioContent.push(\"\");\n\n // Parse preconditions, steps, expected from content\n const content = section.content;\n const preMatch = content.match(/(?:precondition|pre-condition|setup)s?\\s*:\\s*([\\s\\S]*?)(?=steps?\\s*:|expected\\s*:|$)/i);\n const stepsMatch = content.match(/steps?\\s*:\\s*([\\s\\S]*?)(?=expected\\s*:|$)/i);\n const expectedMatch = content.match(/expected\\s*(?:result|outcome)?s?\\s*:\\s*([\\s\\S]*?)$/i);\n\n scenarioContent.push(\"## Setup\");\n scenarioContent.push(preMatch ? preMatch[1].trim() : \"No specific preconditions.\");\n scenarioContent.push(\"\");\n\n scenarioContent.push(\"## Actions\");\n scenarioContent.push(stepsMatch ? stepsMatch[1].trim() : content.trim());\n scenarioContent.push(\"\");\n\n scenarioContent.push(\"## Expected\");\n scenarioContent.push(expectedMatch ? expectedMatch[1].trim() : \"Verify behavior is correct.\");\n scenarioContent.push(\"\");\n\n scenarios.push({\n name: name || `scenario-${scenarios.length + 1}`,\n content: scenarioContent.join(\"\\n\"),\n });\n }\n\n return JSON.stringify(scenarios, null, 2);\n}\n\n// ── Export: Any Artifact → Clean Markdown ──\n\n/**\n * Clean up a BeastMode artifact for external consumption.\n * Strips internal markers, HTML comments, and normalizes formatting.\n */\nexport function exportMarkdown(content: string): string {\n if (!content.trim()) {\n return \"\";\n }\n\n let result = content;\n\n // Strip HTML comments (single-line and multi-line)\n result = result.replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n // Trim trailing whitespace on each line\n result = result\n .split(\"\\n\")\n .map((line) => line.trimEnd())\n .join(\"\\n\");\n\n // Collapse 3+ consecutive blank lines into 2\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n\n // Trim leading/trailing whitespace\n result = result.trim();\n\n // Add metadata footer\n const date = new Date().toISOString().split(\"T\")[0];\n result = result + `\\n\\n---\\n*Exported from BeastMode on ${date}*\\n`;\n\n return result;\n}\n","import type { MethodologyManifest } from \"./types.js\";\nimport {\n importPrd,\n importUserStories,\n importRfc,\n importTestCases,\n} from \"./builtin-adapters.js\";\n\nexport interface BuiltinImportAdapterRef {\n type: \"builtin\";\n id: string;\n name: string;\n to_artifact: string;\n}\n\nexport interface PluginImportAdapterRef {\n type: \"plugin\";\n id: string;\n pluginName: string;\n adapterName: string;\n adapterPath: string;\n to_artifact: string;\n}\n\nexport type ImportAdapterRef = BuiltinImportAdapterRef | PluginImportAdapterRef;\n\nconst BUILTIN_IMPORT_ADAPTERS: Record<string, { to_artifact: string }> = {\n prd: { to_artifact: \"nlspec.md\" },\n \"user-stories\": { to_artifact: \"plan.md\" },\n rfc: { to_artifact: \"nlspec.md\" },\n \"test-cases\": { to_artifact: \"scenarios/\" },\n};\n\n/**\n * Resolve an adapter ID to its reference (builtin or plugin).\n * Pure function — no I/O.\n */\nexport function resolveImportAdapter(\n adapterId: string,\n methodologyManifests?: MethodologyManifest[]\n): ImportAdapterRef {\n const colonIndex = adapterId.indexOf(\":\");\n if (colonIndex === -1) {\n throw new Error(\n `Invalid adapter ID '${adapterId}'. Must be in format 'namespace:name' (e.g., 'generic:prd').`\n );\n }\n\n const namespace = adapterId.slice(0, colonIndex);\n const name = adapterId.slice(colonIndex + 1);\n\n if (namespace === \"generic\") {\n const entry = BUILTIN_IMPORT_ADAPTERS[name];\n if (!entry) {\n throw new Error(\n `Unknown built-in import adapter 'generic:${name}'. Available: ${Object.keys(BUILTIN_IMPORT_ADAPTERS).map((k) => `generic:${k}`).join(\", \")}`\n );\n }\n return {\n type: \"builtin\",\n id: adapterId,\n name,\n to_artifact: entry.to_artifact,\n };\n }\n\n // Plugin adapter\n const manifests = methodologyManifests || [];\n const manifest = manifests.find((m) => m.name === namespace);\n if (!manifest) {\n throw new Error(\n `No methodology manifest found for plugin '${namespace}'. Is the plugin installed?`\n );\n }\n\n const adapterEntry = manifest.import_adapters[name];\n if (!adapterEntry) {\n throw new Error(\n `Import adapter '${name}' not found in methodology '${namespace}'. Available: ${Object.keys(manifest.import_adapters).join(\", \") || \"none\"}`\n );\n }\n\n return {\n type: \"plugin\",\n id: adapterId,\n pluginName: namespace,\n adapterName: name,\n adapterPath: adapterEntry.adapter,\n to_artifact: adapterEntry.to_artifact,\n };\n}\n\n/**\n * Run an import adapter on source content.\n * For builtin adapters, calls the corresponding pure function.\n * For plugin adapters, returns the raw content (plugin adapter execution is a future feature).\n * Pure function — no I/O.\n */\nexport function runImportAdapter(\n adapterId: string,\n sourceContent: string,\n methodologyManifests?: MethodologyManifest[]\n): string {\n const ref = resolveImportAdapter(adapterId, methodologyManifests);\n\n if (ref.type === \"builtin\") {\n switch (ref.name) {\n case \"prd\":\n return importPrd(sourceContent);\n case \"user-stories\":\n return importUserStories(sourceContent);\n case \"rfc\":\n return importRfc(sourceContent);\n case \"test-cases\":\n return importTestCases(sourceContent);\n default:\n throw new Error(`No built-in import handler for '${ref.name}'`);\n }\n }\n\n // Plugin adapter — return source content as-is for now\n // AI-powered transformation will be implemented with methodology plugins\n return sourceContent;\n}\n","import type { MethodologyManifest } from \"./types.js\";\nimport { exportMarkdown } from \"./builtin-adapters.js\";\n\nexport interface BuiltinExportAdapterRef {\n type: \"builtin\";\n id: string;\n name: string;\n from_artifact: string; // \"*\" for generic:markdown (works on any artifact)\n}\n\nexport interface PluginExportAdapterRef {\n type: \"plugin\";\n id: string;\n pluginName: string;\n adapterName: string;\n adapterPath: string;\n from_artifact: string;\n}\n\nexport type ExportAdapterRef = BuiltinExportAdapterRef | PluginExportAdapterRef;\n\nconst BUILTIN_EXPORT_ADAPTERS: Record<string, { from_artifact: string }> = {\n markdown: { from_artifact: \"*\" },\n};\n\n/**\n * Resolve an export adapter ID to its reference.\n * Pure function — no I/O.\n */\nexport function resolveExportAdapter(\n adapterId: string,\n methodologyManifests?: MethodologyManifest[]\n): ExportAdapterRef {\n const colonIndex = adapterId.indexOf(\":\");\n if (colonIndex === -1) {\n throw new Error(\n `Invalid adapter ID '${adapterId}'. Must be in format 'namespace:name' (e.g., 'generic:markdown').`\n );\n }\n\n const namespace = adapterId.slice(0, colonIndex);\n const name = adapterId.slice(colonIndex + 1);\n\n if (namespace === \"generic\") {\n const entry = BUILTIN_EXPORT_ADAPTERS[name];\n if (!entry) {\n throw new Error(\n `Unknown built-in export adapter 'generic:${name}'. Available: ${Object.keys(BUILTIN_EXPORT_ADAPTERS).map((k) => `generic:${k}`).join(\", \")}`\n );\n }\n return {\n type: \"builtin\",\n id: adapterId,\n name,\n from_artifact: entry.from_artifact,\n };\n }\n\n // Plugin adapter\n const manifests = methodologyManifests || [];\n const manifest = manifests.find((m) => m.name === namespace);\n if (!manifest) {\n throw new Error(\n `No methodology manifest found for plugin '${namespace}'. Is the plugin installed?`\n );\n }\n\n const adapterEntry = manifest.export_adapters[name];\n if (!adapterEntry) {\n throw new Error(\n `Export adapter '${name}' not found in methodology '${namespace}'. Available: ${Object.keys(manifest.export_adapters).join(\", \") || \"none\"}`\n );\n }\n\n return {\n type: \"plugin\",\n id: adapterId,\n pluginName: namespace,\n adapterName: name,\n adapterPath: adapterEntry.adapter,\n from_artifact: adapterEntry.from_artifact,\n };\n}\n\n/**\n * Run an export adapter on source content.\n * For builtin adapters, calls the corresponding pure function.\n * For plugin adapters, returns the raw content (future: AI-powered).\n * Pure function — no I/O.\n */\nexport function runExportAdapter(\n adapterId: string,\n sourceContent: string,\n methodologyManifests?: MethodologyManifest[]\n): string {\n const ref = resolveExportAdapter(adapterId, methodologyManifests);\n\n if (ref.type === \"builtin\") {\n switch (ref.name) {\n case \"markdown\":\n return exportMarkdown(sourceContent);\n default:\n throw new Error(`No built-in export handler for '${ref.name}'`);\n }\n }\n\n // Plugin adapter — return source content as-is for now\n return sourceContent;\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { StackInfo } from \"./types.js\";\n\ninterface StackPreset {\n language: string;\n build: string;\n dev: string;\n test: string;\n install: string;\n port: number;\n preset: string;\n deploy: string;\n plugins: string[];\n}\n\nconst STACK_PRESETS: Record<string, StackPreset> = {\n nextjs: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"npx playwright test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"nextjs\", \"playwright\"],\n },\n vite: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 5173,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"playwright\"],\n },\n react: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} start\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"full\",\n deploy: \"vercel\",\n plugins: [\"playwright\"],\n },\n node: {\n language: \"typescript\",\n build: \"{pm} run build\",\n dev: \"{pm} run dev\",\n test: \"{pm} test\",\n install: \"{pm} install\",\n port: 3000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n fastapi: {\n language: \"python\",\n build: \"python -m build\",\n dev: \"uvicorn main:app --reload\",\n test: \"pytest\",\n install: \"pip install -e .\",\n port: 8000,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [\"playwright\"],\n },\n django: {\n language: \"python\",\n build: \"python manage.py collectstatic --noinput\",\n dev: \"python manage.py runserver\",\n test: \"python manage.py test\",\n install: \"pip install -r requirements.txt\",\n port: 8000,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [\"playwright\"],\n },\n python: {\n language: \"python\",\n build: \"python -m build\",\n dev: \"python -m uvicorn main:app --reload\",\n test: \"pytest\",\n install: \"pip install -e .\",\n port: 8000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n go: {\n language: \"go\",\n build: \"go build ./...\",\n dev: \"go run .\",\n test: \"go test ./...\",\n install: \"go mod download\",\n port: 8080,\n preset: \"lean\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n rust: {\n language: \"rust\",\n build: \"cargo build --release\",\n dev: \"cargo run\",\n test: \"cargo test\",\n install: \"cargo build\",\n port: 8080,\n preset: \"lean\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n \"java-maven\": {\n language: \"java\",\n build: \"mvn package\",\n dev: \"mvn spring-boot:run\",\n test: \"mvn test\",\n install: \"mvn install\",\n port: 8080,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n \"java-gradle\": {\n language: \"java\",\n build: \"./gradlew build\",\n dev: \"./gradlew bootRun\",\n test: \"./gradlew test\",\n install: \"./gradlew build\",\n port: 8080,\n preset: \"full\",\n deploy: \"aws-ecs\",\n plugins: [],\n },\n unknown: {\n language: \"unknown\",\n build: \"echo 'no build command configured'\",\n dev: \"echo 'no dev command configured'\",\n test: \"echo 'no test command configured'\",\n install: \"echo 'no install command configured'\",\n port: 3000,\n preset: \"lean\",\n deploy: \"pr-only\",\n plugins: [],\n },\n};\n\nfunction readFileSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction parseJsonSafe(content: string): Record<string, unknown> | null {\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\nfunction detectPackageManager(projectDir: string): string {\n if (existsSync(join(projectDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(projectDir, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(projectDir, \"bun.lockb\"))) return \"bun\";\n return \"npm\";\n}\n\nfunction resolveCommands(preset: StackPreset, pm: string): StackPreset {\n return {\n ...preset,\n build: preset.build.replace(\"{pm}\", pm),\n dev: preset.dev.replace(\"{pm}\", pm),\n test: preset.test.replace(\"{pm}\", pm),\n install: preset.install.replace(\"{pm}\", pm),\n };\n}\n\nfunction detectFramework(projectDir: string): string {\n const pkgContent = readFileSafe(join(projectDir, \"package.json\"));\n if (pkgContent) {\n const pkg = parseJsonSafe(pkgContent);\n if (pkg) {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n if (deps.next) return \"nextjs\";\n if (deps.vite) return \"vite\";\n if (deps[\"react-scripts\"]) return \"react\";\n return \"node\";\n }\n return \"node\";\n }\n\n if (existsSync(join(projectDir, \"manage.py\"))) return \"django\";\n const pyproject = readFileSafe(join(projectDir, \"pyproject.toml\"));\n if (pyproject) {\n if (pyproject.toLowerCase().includes(\"fastapi\")) return \"fastapi\";\n return \"python\";\n }\n if (existsSync(join(projectDir, \"requirements.txt\"))) {\n const reqs = readFileSafe(join(projectDir, \"requirements.txt\")) || \"\";\n if (reqs.toLowerCase().includes(\"django\")) return \"django\";\n if (reqs.toLowerCase().includes(\"fastapi\")) return \"fastapi\";\n return \"python\";\n }\n\n if (existsSync(join(projectDir, \"go.mod\"))) return \"go\";\n if (existsSync(join(projectDir, \"Cargo.toml\"))) return \"rust\";\n if (existsSync(join(projectDir, \"pom.xml\"))) return \"java-maven\";\n if (\n existsSync(join(projectDir, \"build.gradle\")) ||\n existsSync(join(projectDir, \"build.gradle.kts\"))\n )\n return \"java-gradle\";\n\n return \"unknown\";\n}\n\nfunction extractGitRemote(projectDir: string): string | null {\n const gitConfig = readFileSafe(join(projectDir, \".git\", \"config\"));\n if (!gitConfig) return null;\n\n const sshMatch = gitConfig.match(/url\\s*=\\s*git@github\\.com:([^/]+\\/[^.\\s]+)/);\n if (sshMatch) return sshMatch[1];\n\n const httpsMatch = gitConfig.match(/url\\s*=\\s*https:\\/\\/github\\.com\\/([^/]+\\/[^.\\s]+)/);\n if (httpsMatch) return httpsMatch[1].replace(/\\.git$/, \"\");\n\n return null;\n}\n\nexport function detectStack(projectDir: string): StackInfo {\n const framework = detectFramework(projectDir);\n const preset = STACK_PRESETS[framework] || STACK_PRESETS.unknown;\n const pm = [\"nextjs\", \"vite\", \"react\", \"node\"].includes(framework)\n ? detectPackageManager(projectDir)\n : preset.language === \"python\"\n ? \"pip\"\n : \"\";\n const resolved = resolveCommands(preset, pm);\n\n return {\n language: resolved.language,\n framework,\n package_manager: pm,\n has_docker:\n existsSync(join(projectDir, \"Dockerfile\")) ||\n existsSync(join(projectDir, \"docker-compose.yml\")) ||\n existsSync(join(projectDir, \"docker-compose.yaml\")),\n has_ci:\n existsSync(join(projectDir, \".github\", \"workflows\")) ||\n existsSync(join(projectDir, \".gitlab-ci.yml\")) ||\n existsSync(join(projectDir, \".circleci\")),\n git_remote: extractGitRemote(projectDir),\n suggested_commands: {\n build: resolved.build,\n dev: resolved.dev,\n test: resolved.test,\n install: resolved.install,\n },\n dev_port: resolved.port,\n suggested_plugins: resolved.plugins,\n suggested_preset: resolved.preset,\n suggested_deploy: resolved.deploy,\n };\n}\n","interface StageOverrides {\n spec_refiner: { enabled: boolean | \"auto\" };\n planner: { enabled: boolean | \"auto\" };\n scenario_designer: { enabled: boolean | \"auto\" };\n dtu_builder: { enabled: boolean | \"auto\" };\n build_verify_loop: { enabled: boolean | \"auto\" };\n pr_review: { enabled: boolean | \"auto\" };\n prod_verification: { enabled: boolean | \"auto\" };\n}\n\nexport interface PresetConfig {\n stages: StageOverrides;\n satisfaction_threshold: number;\n max_iterations: number;\n description: string;\n}\n\nconst ALL_ENABLED: StageOverrides = {\n spec_refiner: { enabled: true },\n planner: { enabled: true },\n scenario_designer: { enabled: true },\n dtu_builder: { enabled: \"auto\" },\n build_verify_loop: { enabled: true },\n pr_review: { enabled: true },\n prod_verification: { enabled: false },\n};\n\nexport const PRESETS: Record<string, PresetConfig> = {\n full: {\n stages: ALL_ENABLED,\n satisfaction_threshold: 0.85,\n max_iterations: 5,\n description: \"All stages enabled, high quality bar — for production apps with CI/CD\",\n },\n lean: {\n stages: {\n ...ALL_ENABLED,\n dtu_builder: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.75,\n max_iterations: 3,\n description: \"Skip DTU + prod verify, lower threshold — for scripts, tools, CLIs\",\n },\n prototype: {\n stages: {\n ...ALL_ENABLED,\n scenario_designer: { enabled: false },\n build_verify_loop: { enabled: false },\n dtu_builder: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 1,\n description: \"Spec → build → PR, no scenarios — for rapid prototyping, hackathons\",\n },\n infra: {\n stages: {\n ...ALL_ENABLED,\n dtu_builder: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 5,\n description: \"Terraform-focused, AWS-CLI verification — for infrastructure tasks\",\n },\n docs: {\n stages: {\n ...ALL_ENABLED,\n scenario_designer: { enabled: false },\n dtu_builder: { enabled: false },\n build_verify_loop: { enabled: false },\n prod_verification: { enabled: false },\n },\n satisfaction_threshold: 0.85,\n max_iterations: 1,\n description: \"Spec → build → PR only — for documentation, content changes\",\n },\n};\n\nexport function getPreset(name: string): PresetConfig {\n const preset = PRESETS[name];\n if (!preset) {\n throw new Error(`Unknown preset: ${name}. Available: ${listPresets().join(\", \")}`);\n }\n return preset;\n}\n\nexport function listPresets(): string[] {\n return Object.keys(PRESETS);\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\nimport { getPreset } from \"./presets.js\";\nimport type { FactoryConfig, StackInfo } from \"./types.js\";\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n const sourceVal = source[key];\n const targetVal = target[key];\n if (\n sourceVal !== null &&\n typeof sourceVal === \"object\" &&\n !Array.isArray(sourceVal) &&\n targetVal !== null &&\n typeof targetVal === \"object\" &&\n !Array.isArray(targetVal)\n ) {\n result[key] = deepMerge(\n targetVal as Record<string, unknown>,\n sourceVal as Record<string, unknown>\n );\n } else {\n result[key] = sourceVal;\n }\n }\n return result;\n}\n\nexport function resolveDefaults(\n partial: Record<string, unknown>,\n _stack: StackInfo\n): FactoryConfig {\n // 1. Start with schema defaults\n const base = FactoryConfigSchema.parse({});\n\n // 2. Determine which preset to use\n const presetName =\n (partial.pipeline as Record<string, unknown> | undefined)?.preset as string | undefined;\n const preset = getPreset(presetName || _stack.suggested_preset);\n\n // 3. Apply preset overrides to base\n const withPreset = deepMerge(\n base as unknown as Record<string, unknown>,\n {\n pipeline: {\n preset: presetName || _stack.suggested_preset,\n stages: preset.stages,\n satisfaction_threshold: preset.satisfaction_threshold,\n max_iterations: preset.max_iterations,\n },\n }\n );\n\n // 4. Apply user overrides on top (highest priority)\n const merged = deepMerge(withPreset, partial);\n\n // 5. Validate and return\n return FactoryConfigSchema.parse(merged);\n}\n\nexport function resolveProject(\n factoryConfig: FactoryConfig,\n projectOverrides: Record<string, unknown>\n): FactoryConfig {\n const merged = deepMerge(\n factoryConfig as unknown as Record<string, unknown>,\n projectOverrides\n );\n return FactoryConfigSchema.parse(merged);\n}\n","import type { FactoryConfig, SecretReport, SecretRequirement } from \"./types.js\";\n\ninterface SecretContext {\n deploy_target?: string;\n}\n\nconst DEPLOY_SECRETS: Record<string, SecretRequirement[]> = {\n vercel: [{ name: \"VERCEL_TOKEN\", reason: \"Vercel deployment\", required: true }],\n netlify: [{ name: \"NETLIFY_AUTH_TOKEN\", reason: \"Netlify deployment\", required: true }],\n \"aws-ecs\": [\n { name: \"AWS_ACCESS_KEY_ID\", reason: \"AWS ECS deployment\", required: true },\n { name: \"AWS_SECRET_ACCESS_KEY\", reason: \"AWS ECS deployment\", required: true },\n ],\n \"aws-lambda\": [\n { name: \"AWS_ACCESS_KEY_ID\", reason: \"AWS Lambda deployment\", required: true },\n { name: \"AWS_SECRET_ACCESS_KEY\", reason: \"AWS Lambda deployment\", required: true },\n ],\n \"gcp-cloud-run\": [\n { name: \"GOOGLE_APPLICATION_CREDENTIALS\", reason: \"GCP Cloud Run deployment\", required: true },\n ],\n};\n\nconst BACKEND_SECRETS: Record<string, SecretRequirement[]> = {\n linear: [{ name: \"LINEAR_API_KEY\", reason: \"Linear task backend\", required: true }],\n jira: [{ name: \"JIRA_API_TOKEN\", reason: \"Jira task backend\", required: true }],\n};\n\nexport function validateSecrets(\n config: FactoryConfig,\n env: Record<string, string | undefined>,\n context: SecretContext = {}\n): SecretReport {\n const required: SecretRequirement[] = [\n // ANTHROPIC_API_KEY is optional — the pipeline uses the Claude Code CLI\n // (`claude login`) by default. If set, it enables faster direct API calls.\n { name: \"ANTHROPIC_API_KEY\", reason: \"Optional: faster direct API calls (pipeline uses Claude Code CLI by default)\", required: false },\n { name: \"GITHUB_TOKEN\", reason: \"PR creation and repo access\", required: true },\n ];\n\n // Add backend-specific secrets\n const backendSecrets = BACKEND_SECRETS[config.task_backend.adapter];\n if (backendSecrets) {\n required.push(...backendSecrets);\n }\n\n // Add deploy-specific secrets\n const deployTarget = context.deploy_target || \"pr-only\";\n const deploySecrets = DEPLOY_SECRETS[deployTarget];\n if (deploySecrets) {\n required.push(...deploySecrets);\n }\n\n const present: string[] = [];\n const missing: string[] = [];\n const optional: string[] = [];\n\n for (const req of required) {\n if (env[req.name]) {\n present.push(req.name);\n } else if (req.required) {\n missing.push(req.name);\n } else {\n optional.push(req.name);\n }\n }\n\n return { required, present, missing, optional };\n}\n","export const ENGINE_VERSION = \"0.1.0\";\nexport const SCHEMA_VERSION = 1;\n","import type { FactoryConfig, FileAction, StackInfo } from \"./types.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\ninterface ProjectInput {\n name: string;\n repo?: string;\n path: string;\n stack: StackInfo;\n deploy_target?: string;\n}\n\nexport function scaffoldFactory(\n factoryName: string,\n config: FactoryConfig,\n project: ProjectInput\n): FileAction[] {\n const base = factoryName;\n const bm = `${base}/.beastmode`;\n const actions: FileAction[] = [];\n\n // factory.json\n actions.push({\n path: `${bm}/factory.json`,\n content: JSON.stringify(\n {\n factory_name: factoryName,\n engine_version: ENGINE_VERSION,\n schema_version: SCHEMA_VERSION,\n created_at: new Date().toISOString(),\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // config.json\n actions.push({\n path: `${bm}/config.json`,\n content: JSON.stringify(config, null, 2),\n action: \"create\",\n });\n\n // projects/<name>.json\n actions.push({\n path: `${bm}/projects/${project.name}.json`,\n content: JSON.stringify(\n {\n name: project.name,\n repo: project.repo || project.stack.git_remote || \"\",\n path: project.path,\n stack: {\n detected: project.stack.framework,\n build_command: project.stack.suggested_commands.build,\n dev_command: project.stack.suggested_commands.dev,\n test_command: project.stack.suggested_commands.test,\n install_command: project.stack.suggested_commands.install,\n dev_port: project.stack.dev_port,\n },\n deploy: {\n target: project.deploy_target || project.stack.suggested_deploy,\n config: {},\n },\n pipeline: {},\n models: {},\n plugins: project.stack.suggested_plugins,\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // hooks.json\n actions.push({\n path: `${bm}/hooks.json`,\n content: JSON.stringify(\n {\n hooks: {\n \"pre-spec\": [],\n \"post-spec\": [],\n \"pre-plan\": [],\n \"post-plan\": [],\n \"pre-build\": [],\n \"post-build\": [],\n \"pre-verify\": [],\n \"post-verify\": [],\n \"pre-ship\": [],\n \"post-ship\": [],\n \"on-convergence\": [],\n \"on-failure\": [],\n \"on-stuck\": [],\n },\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // mcp-servers.json\n actions.push({\n path: `${bm}/mcp-servers.json`,\n content: JSON.stringify({ servers: {} }, null, 2),\n action: \"create\",\n });\n\n // extensions.lock\n actions.push({\n path: `${bm}/extensions.lock`,\n content: JSON.stringify({ plugins: {}, locked_at: new Date().toISOString() }, null, 2),\n action: \"create\",\n });\n\n // secrets.env.local (empty, gitignored)\n actions.push({\n path: `${bm}/secrets.env.local`,\n content: \"# BeastMode secrets — DO NOT COMMIT\\n# Add your secrets here or set as environment variables\\n\",\n action: \"create\",\n });\n\n // .gitignore\n actions.push({\n path: `${base}/.gitignore`,\n content: [\n \"# BeastMode\",\n \".beastmode/secrets.env.local\",\n \"runs/\",\n \"logs/\",\n \"node_modules/\",\n \"dist/\",\n \".env\",\n \".env.local\",\n \"*.log\",\n \".DS_Store\",\n \"\",\n ].join(\"\\n\"),\n action: \"create\",\n });\n\n // .env.example\n actions.push({\n path: `${base}/.env.example`,\n content: [\n \"# BeastMode — Environment Variables\",\n \"# Copy to .env.local or set in your shell\",\n \"\",\n \"# AI auth: uses Claude Code CLI by default (`claude login`).\",\n \"# Set ANTHROPIC_API_KEY for faster direct API calls (optional).\",\n \"# ANTHROPIC_API_KEY=\",\n \"\",\n \"# Required: GitHub access (needs repo + workflow scopes)\",\n \"GITHUB_TOKEN=\",\n \"\",\n \"# Optional: Task backend (only if not using built-in board)\",\n \"# LINEAR_API_KEY=\",\n \"\",\n \"# Optional: Deploy target secrets\",\n \"# VERCEL_TOKEN=\",\n \"# AWS_ACCESS_KEY_ID=\",\n \"# AWS_SECRET_ACCESS_KEY=\",\n \"\",\n ].join(\"\\n\"),\n action: \"create\",\n });\n\n // Create empty directories by placing .gitkeep\n for (const dir of [\"runs\", \"logs\"]) {\n actions.push({\n path: `${base}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n // Create empty directories for plugins and skills\n for (const dir of [\"plugins\", \"skills\"]) {\n actions.push({\n path: `${bm}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n return actions;\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\nimport type { FactoryConfig } from \"./types.js\";\n\nexport interface FactoryTemplate {\n factory_name?: string;\n config: FactoryConfig;\n plugins: string[];\n methodology?: string;\n}\n\nexport function parseTemplate(raw: string): FactoryTemplate {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(\"Template is not valid JSON\");\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Template must be a JSON object\");\n }\n\n const obj = parsed as Record<string, unknown>;\n\n const configResult = FactoryConfigSchema.safeParse(obj.config || {});\n if (!configResult.success) {\n const issues = configResult.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid template config:\\n${issues}`);\n }\n\n return {\n factory_name: typeof obj.factory_name === \"string\" ? obj.factory_name : undefined,\n config: configResult.data,\n plugins: Array.isArray(obj.plugins) ? obj.plugins.filter((p): p is string => typeof p === \"string\") : [],\n methodology: typeof obj.methodology === \"string\" ? obj.methodology : undefined,\n };\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { FactoryConfigSchema, FactoryIdentitySchema } from \"./schemas.js\";\nimport { validateSecrets } from \"./secret-validator.js\";\n\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\nexport function validateFactory(\n factoryDir: string,\n env: Record<string, string | undefined>\n): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n const bmDir = join(factoryDir, \".beastmode\");\n\n // Check .beastmode exists\n if (!existsSync(bmDir)) {\n return { valid: false, errors: [`No factory found at ${factoryDir} (.beastmode directory missing)`], warnings };\n }\n\n // Check factory.json\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n errors.push(\"Missing .beastmode/factory.json\");\n } else {\n try {\n const raw = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const result = FactoryIdentitySchema.safeParse(raw);\n if (!result.success) {\n errors.push(`Invalid factory.json: ${result.error.issues.map((i) => i.message).join(\", \")}`);\n }\n } catch {\n errors.push(\"factory.json is not valid JSON\");\n }\n }\n\n // Check config.json\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n errors.push(\"Missing .beastmode/config.json\");\n } else {\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const result = FactoryConfigSchema.safeParse(raw);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push(`config.json ${issue.path.join(\".\")}: ${issue.message}`);\n }\n } else {\n // Validate secrets\n const secretReport = validateSecrets(result.data, env as Record<string, string>);\n for (const key of secretReport.missing) {\n warnings.push(`Secret not set: ${key}`);\n }\n }\n } catch {\n errors.push(\"config.json is not valid JSON\");\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import type { FactoryIdentity } from \"./types.js\";\n\n// Grace window (seconds) for considering a daemon heartbeat \"fresh\".\n// Matches GRACE_WINDOW_SECONDS on the board side (180s = ~3 missed polls\n// at the default 30-60s poll interval).\nexport const DAEMON_HEARTBEAT_GRACE_SEC = 180;\n\nexport interface StatusInput {\n factoryIdentity: FactoryIdentity;\n projectCount: number;\n pluginNames: string[];\n mcpServers: Record<string, unknown>;\n hooks: Record<string, unknown[]>;\n skillCount: number;\n runDirs: string[];\n daemonPid: number | null;\n pidAlive: boolean;\n // Seconds since the last heartbeat posted to the board. null if no\n // heartbeat has ever been posted (or the board couldn't be reached).\n // When this is fresh (< DAEMON_HEARTBEAT_GRACE_SEC) the daemon is\n // considered running even if we can't see its PID from here -- this\n // is how Docker Compose / remote deployments report status.\n daemonHeartbeatAgeSec?: number | null;\n}\n\nexport interface FactoryStatus {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n counts: {\n projects: number;\n plugins: number;\n mcps: number;\n skills: number;\n hooks: number;\n };\n last_run: {\n run_id: string;\n } | null;\n daemon: {\n status: \"running\" | \"stopped\";\n pid: number | null;\n };\n}\n\nexport function collectStatus(input: StatusInput): FactoryStatus {\n const {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n daemonHeartbeatAgeSec = null,\n } = input;\n\n // Count hooks across all events\n let hookCount = 0;\n for (const entries of Object.values(hooks)) {\n hookCount += entries.length;\n }\n\n // Find most recent run (dirs are sorted ascending by name)\n const lastRun = runDirs.length > 0\n ? { run_id: runDirs[runDirs.length - 1] }\n : null;\n\n // Determine daemon status. Prefer a fresh heartbeat (works across\n // containers / remote hosts) and fall back to the local PID check.\n const heartbeatFresh =\n daemonHeartbeatAgeSec !== null &&\n daemonHeartbeatAgeSec >= 0 &&\n daemonHeartbeatAgeSec < DAEMON_HEARTBEAT_GRACE_SEC;\n const daemonStatus: \"running\" | \"stopped\" =\n heartbeatFresh || (daemonPid !== null && pidAlive) ? \"running\" : \"stopped\";\n\n return {\n factory_name: factoryIdentity.factory_name,\n engine_version: factoryIdentity.engine_version,\n schema_version: factoryIdentity.schema_version,\n created_at: factoryIdentity.created_at,\n counts: {\n projects: projectCount,\n plugins: pluginNames.length,\n mcps: Object.keys(mcpServers).length,\n skills: skillCount,\n hooks: hookCount,\n },\n last_run: lastRun,\n daemon: {\n status: daemonStatus,\n pid: daemonPid,\n },\n };\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\n\n/**\n * Coerce a string value into the appropriate JS type.\n * Used by `config set` to auto-detect booleans, numbers, null.\n */\nexport function coerceValue(raw: string): unknown {\n if (raw === \"true\") return true;\n if (raw === \"false\") return false;\n if (raw === \"null\") return null;\n if (raw === \"\") return raw;\n const num = Number(raw);\n if (!isNaN(num)) return num;\n return raw;\n}\n\n/**\n * Get a value from a config object using dot-notation.\n * Throws if the key path does not exist.\n */\nexport function configGet(config: Record<string, unknown>, keyPath: string): unknown {\n const parts = keyPath.split(\".\");\n let current: unknown = config;\n\n for (let i = 0; i < parts.length; i++) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n const traversed = parts.slice(0, i).join(\".\");\n throw new Error(`Key not found: ${traversed}`);\n }\n const key = parts[i];\n const obj = current as Record<string, unknown>;\n if (!(key in obj)) {\n const fullPath = parts.slice(0, i + 1).join(\".\");\n throw new Error(`Key not found: ${fullPath}`);\n }\n current = obj[key];\n }\n\n return current;\n}\n\n/**\n * Set a value in a config object using dot-notation.\n * Creates intermediate objects as needed.\n * Returns a new config object (shallow clones along the path).\n */\nexport function configSet(\n config: Record<string, unknown>,\n keyPath: string,\n value: unknown\n): Record<string, unknown> {\n const parts = keyPath.split(\".\");\n if (parts.length === 1) {\n return { ...config, [parts[0]]: value };\n }\n\n const [head, ...rest] = parts;\n const child = (config[head] !== undefined && config[head] !== null && typeof config[head] === \"object\")\n ? { ...(config[head] as Record<string, unknown>) }\n : {};\n\n return {\n ...config,\n [head]: configSet(child, rest.join(\".\"), value),\n };\n}\n\n/**\n * Generate the full default config from the Zod schema.\n */\nexport function generateDefaults(): Record<string, unknown> {\n return FactoryConfigSchema.parse({}) as unknown as Record<string, unknown>;\n}\n\n/**\n * Reset config to defaults. If keyPath is provided, reset only that path.\n * If no keyPath, reset the entire config to schema defaults.\n */\nexport function configReset(\n config: Record<string, unknown>,\n keyPath?: string\n): Record<string, unknown> {\n const defaults = generateDefaults();\n\n if (!keyPath) {\n return defaults;\n }\n\n // Get the default value at the key path\n const defaultValue = configGet(defaults, keyPath);\n return configSet(config, keyPath, defaultValue);\n}\n","import semver from \"semver\";\nimport type { FactoryIdentity } from \"./types.js\";\n\nexport interface DoctorInput {\n factoryDirExists: boolean;\n factoryIdentity: FactoryIdentity | null;\n config: Record<string, unknown> | null;\n configParseError: string | null;\n env: Record<string, string | undefined>;\n projectPaths: Array<{ name: string; path: string; exists: boolean }>;\n installedPlugins: Array<{ name: string; engine_version: string }>;\n engineVersion: string;\n portsInUse: Array<{ project: string; port: number; inUse: boolean }>;\n}\n\nexport interface DoctorCheck {\n name: string;\n status: \"pass\" | \"fail\" | \"warn\";\n message: string;\n fix?: string;\n}\n\nexport interface DoctorReport {\n checks: DoctorCheck[];\n passed: number;\n failed: number;\n warnings: number;\n}\n\nconst REQUIRED_SECRETS = [\"ANTHROPIC_API_KEY\", \"GITHUB_TOKEN\"];\n\nexport function runDiagnostics(input: DoctorInput): DoctorReport {\n const checks: DoctorCheck[] = [];\n\n // 1. Factory directory exists\n if (input.factoryDirExists) {\n checks.push({\n name: \"Factory directory\",\n status: \"pass\",\n message: \"Factory directory exists\",\n });\n } else {\n checks.push({\n name: \"Factory directory\",\n status: \"fail\",\n message: \"No .beastmode/ directory found\",\n fix: \"Run: beastmode init\",\n });\n // Early summary — downstream checks are meaningless without factory\n return summarize(checks);\n }\n\n // 2. Config schema valid\n if (input.config !== null && input.configParseError === null) {\n checks.push({\n name: \"Config schema\",\n status: \"pass\",\n message: \"Config schema is valid\",\n });\n } else {\n checks.push({\n name: \"Config schema\",\n status: \"fail\",\n message: input.configParseError || \"Config is missing or invalid\",\n fix: \"Run: beastmode validate --verbose\",\n });\n }\n\n // 3. Factory identity valid\n if (input.factoryIdentity !== null) {\n checks.push({\n name: \"Factory identity\",\n status: \"pass\",\n message: \"Factory identity is valid\",\n });\n } else {\n checks.push({\n name: \"Factory identity\",\n status: \"fail\",\n message: \"factory.json is missing or invalid\",\n fix: \"Re-run: beastmode init\",\n });\n }\n\n // 4. Secrets present\n const missingSecrets = REQUIRED_SECRETS.filter((s) => !input.env[s]);\n if (missingSecrets.length === 0) {\n checks.push({\n name: \"Secrets\",\n status: \"pass\",\n message: \"All required secrets are set\",\n });\n } else {\n checks.push({\n name: \"Secrets\",\n status: \"warn\",\n message: `Missing secrets: ${missingSecrets.join(\", \")}`,\n fix: missingSecrets.map((s) => `export ${s}=<your-value>`).join(\"\\n\"),\n });\n }\n\n // 5. Project paths accessible\n const missingProjects = input.projectPaths.filter((p) => !p.exists);\n if (missingProjects.length === 0) {\n checks.push({\n name: \"Project paths\",\n status: \"pass\",\n message: input.projectPaths.length === 0\n ? \"No projects configured\"\n : \"All project paths are accessible\",\n });\n } else {\n checks.push({\n name: \"Project paths\",\n status: \"fail\",\n message: `Missing paths: ${missingProjects.map((p) => `${p.name} (${p.path})`).join(\", \")}`,\n fix: missingProjects\n .map((p) => `Update path: beastmode config set projects.${p.name}.path <new-path>`)\n .join(\"\\n\"),\n });\n }\n\n // 6. Plugin compatibility\n const incompatible = input.installedPlugins.filter((p) => {\n try {\n return !semver.satisfies(input.engineVersion, p.engine_version);\n } catch {\n return true; // Invalid semver range treated as incompatible\n }\n });\n if (incompatible.length === 0) {\n checks.push({\n name: \"Plugin compatibility\",\n status: \"pass\",\n message: \"All plugins are compatible with engine version\",\n });\n } else {\n checks.push({\n name: \"Plugin compatibility\",\n status: \"warn\",\n message: `Incompatible plugins: ${incompatible.map((p) => `${p.name} (requires ${p.engine_version})`).join(\", \")}`,\n fix: \"Upgrade the plugin or engine to a compatible version\",\n });\n }\n\n // 7. Port conflicts\n const conflicting = input.portsInUse.filter((p) => p.inUse);\n if (conflicting.length === 0) {\n checks.push({\n name: \"Port conflicts\",\n status: \"pass\",\n message: \"No port conflicts detected\",\n });\n } else {\n checks.push({\n name: \"Port conflicts\",\n status: \"warn\",\n message: `Ports in use: ${conflicting.map((p) => `${p.project} (port ${p.port})`).join(\", \")}`,\n fix: \"Change the dev_port in project config or stop the process using the port\",\n });\n }\n\n return summarize(checks);\n}\n\nfunction summarize(checks: DoctorCheck[]): DoctorReport {\n return {\n checks,\n passed: checks.filter((c) => c.status === \"pass\").length,\n failed: checks.filter((c) => c.status === \"fail\").length,\n warnings: checks.filter((c) => c.status === \"warn\").length,\n };\n}\n","import { FactoryConfigSchema } from \"./schemas.js\";\n\nexport interface UpgradeCheck {\n current_version: string;\n latest_version: string;\n update_available: boolean;\n migration_needed: boolean;\n current_schema: number;\n latest_schema: number;\n}\n\nexport interface UpgradeResult {\n success: boolean;\n from_version: string;\n to_version: string;\n migrated: boolean;\n changes: string[];\n updatedIdentity: {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n };\n updatedConfig: Record<string, unknown>;\n}\n\n/**\n * Check if an upgrade is available by comparing factory identity\n * against the latest engine version and schema.\n */\nexport function checkUpgrade(\n factoryIdentity: { engine_version: string; schema_version: number },\n latestVersion: string,\n latestSchema: number\n): UpgradeCheck {\n return {\n current_version: factoryIdentity.engine_version,\n latest_version: latestVersion,\n update_available: factoryIdentity.engine_version !== latestVersion,\n migration_needed: factoryIdentity.schema_version !== latestSchema,\n current_schema: factoryIdentity.schema_version,\n latest_schema: latestSchema,\n };\n}\n\n/**\n * Perform an upgrade: bump version, migrate config schema, fill defaults.\n * Pure function — caller handles reading/writing files.\n */\nexport function performUpgrade(\n factoryIdentity: {\n factory_name: string;\n engine_version: string;\n schema_version: number;\n created_at: string;\n },\n config: Record<string, unknown>,\n latestVersion: string,\n latestSchema: number\n): UpgradeResult {\n const changes: string[] = [];\n let migrated = false;\n\n const updatedIdentity = { ...factoryIdentity };\n\n // Check if there's anything to do\n const versionChanged = factoryIdentity.engine_version !== latestVersion;\n const schemaChanged = factoryIdentity.schema_version !== latestSchema;\n\n if (!versionChanged && !schemaChanged) {\n return {\n success: true,\n from_version: factoryIdentity.engine_version,\n to_version: latestVersion,\n migrated: false,\n changes: [],\n updatedIdentity,\n updatedConfig: config,\n };\n }\n\n // Bump engine version\n if (versionChanged) {\n updatedIdentity.engine_version = latestVersion;\n changes.push(`engine_version: ${factoryIdentity.engine_version} -> ${latestVersion}`);\n }\n\n // Migrate config: parse through Zod to fill in new defaults\n // This is forward-compatible — existing valid fields are preserved,\n // new fields get their schema defaults.\n const updatedConfig = FactoryConfigSchema.parse(config) as unknown as Record<string, unknown>;\n migrated = true;\n\n // Bump schema version\n if (schemaChanged) {\n updatedIdentity.schema_version = latestSchema;\n changes.push(`schema_version: ${factoryIdentity.schema_version} -> ${latestSchema}`);\n }\n\n return {\n success: true,\n from_version: factoryIdentity.engine_version,\n to_version: latestVersion,\n migrated,\n changes,\n updatedIdentity,\n updatedConfig,\n };\n}\n","import semver from \"semver\";\nimport { PluginManifestSchema } from \"./schemas.js\";\nimport type { PluginManifest } from \"./types.js\";\n\n/**\n * Parse and validate a raw object into a PluginManifest.\n * Pure function — no I/O.\n */\nexport function parseManifest(raw: unknown): PluginManifest {\n if (typeof raw !== \"object\" || raw === null) {\n throw new Error(\"Plugin manifest must be a JSON object\");\n }\n const result = PluginManifestSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid plugin manifest:\\n${issues}`);\n }\n return result.data;\n}\n\n/**\n * Check if the engine version satisfies the plugin's engine_version requirement.\n * Pure function — no I/O.\n */\nexport function checkEngineCompat(\n requiredRange: string,\n currentVersion: string\n): { compatible: boolean; reason?: string } {\n if (semver.satisfies(currentVersion, requiredRange)) {\n return { compatible: true };\n }\n return {\n compatible: false,\n reason: `Engine version ${currentVersion} does not satisfy required range '${requiredRange}'`,\n };\n}\n\n/**\n * Topological sort of plugin dependencies. Returns install order\n * (dependencies first, target last).\n * Pure function — no I/O.\n */\nexport function resolveDependencies(\n manifests: Record<string, PluginManifest>,\n target: string\n): string[] {\n const resolved: string[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n function visit(name: string, chain: string[]): void {\n if (visited.has(name)) return;\n if (visiting.has(name)) {\n throw new Error(\n `Circular dependency detected: ${[...chain, name].join(\" -> \")}`\n );\n }\n\n const manifest = manifests[name];\n if (!manifest) {\n throw new Error(\n `Dependency '${name}' not found in available manifests`\n );\n }\n\n visiting.add(name);\n\n for (const dep of manifest.dependencies) {\n visit(dep, [...chain, name]);\n }\n\n visiting.delete(name);\n visited.add(name);\n resolved.push(name);\n }\n\n visit(target, []);\n return resolved;\n}\n\n/**\n * Deep merge plugin defaults into base config. Base config wins on conflicts.\n * Pure function — no I/O.\n */\nexport function mergePluginDefaults(\n baseConfig: Record<string, unknown>,\n pluginDefaults: Record<string, unknown>\n): Record<string, unknown> {\n return deepMergeBaseWins(pluginDefaults, baseConfig);\n}\n\n/**\n * Deep merge where `winner` values take priority over `base` values.\n * If both sides have an object at the same key, recurse.\n * Otherwise, winner takes precedence.\n */\nfunction deepMergeBaseWins(\n base: Record<string, unknown>,\n winner: Record<string, unknown>\n): Record<string, unknown> {\n const result = { ...base };\n\n for (const key of Object.keys(winner)) {\n const baseVal = base[key];\n const winnerVal = winner[key];\n\n if (\n winnerVal !== null &&\n typeof winnerVal === \"object\" &&\n !Array.isArray(winnerVal) &&\n baseVal !== null &&\n typeof baseVal === \"object\" &&\n !Array.isArray(baseVal)\n ) {\n result[key] = deepMergeBaseWins(\n baseVal as Record<string, unknown>,\n winnerVal as Record<string, unknown>\n );\n } else {\n result[key] = winnerVal;\n }\n }\n\n return result;\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { RegistryIndexSchema } from \"./schemas.js\";\nimport type { RegistryIndex } from \"./types.js\";\n\nconst DEFAULT_REGISTRY_URL =\n \"https://raw.githubusercontent.com/beastmode-plugins/registry/main/index.json\";\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\n/**\n * Resolve the registry URL. Priority:\n * 1. BEASTMODE_REGISTRY_URL env var (supports file paths and URLs)\n * 2. Default remote URL\n */\nfunction getRegistryUrl(): string {\n return process.env.BEASTMODE_REGISTRY_URL || DEFAULT_REGISTRY_URL;\n}\n\n/**\n * Check if a registry URL is a local file path.\n */\nfunction isLocalPath(url: string): boolean {\n return url.startsWith(\"/\") || url.startsWith(\"./\") || url.startsWith(\"~\") || url.startsWith(\"file://\");\n}\n\n/**\n * Read registry index from a local file path.\n */\nfunction readLocalRegistry(filePath: string): RegistryIndex {\n const resolved = filePath.startsWith(\"file://\")\n ? filePath.slice(7)\n : resolve(filePath);\n if (!existsSync(resolved)) {\n throw new Error(`Local registry file not found: ${resolved}`);\n }\n const raw = JSON.parse(readFileSync(resolved, \"utf-8\"));\n return RegistryIndexSchema.parse(raw);\n}\n\ninterface CacheEntry {\n fetched_at: string;\n data: RegistryIndex;\n}\n\nexport interface PluginSource {\n type: \"local\" | \"git\" | \"registry\";\n path?: string;\n url?: string;\n name?: string;\n version?: string;\n}\n\nfunction getCachePath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \".cache\", \"registry-index.json\");\n}\n\nfunction readCache(factoryDir: string): CacheEntry | null {\n const cachePath = getCachePath(factoryDir);\n if (!existsSync(cachePath)) return null;\n try {\n return JSON.parse(readFileSync(cachePath, \"utf-8\")) as CacheEntry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(factoryDir: string, data: RegistryIndex): void {\n const cachePath = getCachePath(factoryDir);\n const cacheDir = join(factoryDir, \".beastmode\", \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n cachePath,\n JSON.stringify(\n { fetched_at: new Date().toISOString(), data } as CacheEntry,\n null,\n 2\n ),\n \"utf-8\"\n );\n}\n\nfunction isCacheFresh(cache: CacheEntry): boolean {\n const fetchedAt = new Date(cache.fetched_at).getTime();\n return Date.now() - fetchedAt < CACHE_TTL_MS;\n}\n\n/**\n * Fetch the plugin registry index. Uses cache with 1-hour TTL.\n * Falls back to stale cache on network failure.\n *\n * Supports BEASTMODE_REGISTRY_URL env var override:\n * - Local file path: reads directly, skips caching\n * - Remote URL: fetches with cache as normal\n */\nexport async function fetchRegistryIndex(\n factoryDir: string,\n options?: { noCache?: boolean }\n): Promise<RegistryIndex> {\n const noCache = options?.noCache ?? false;\n const registryUrl = getRegistryUrl();\n\n // If local file path, read directly (no caching needed)\n if (isLocalPath(registryUrl)) {\n return readLocalRegistry(registryUrl);\n }\n\n // Check cache first (unless bypassed)\n if (!noCache) {\n const cache = readCache(factoryDir);\n if (cache && isCacheFresh(cache)) {\n return cache.data;\n }\n }\n\n // Try to fetch from remote\n try {\n const response = await fetch(registryUrl);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const raw = await response.json();\n const result = RegistryIndexSchema.parse(raw);\n writeCache(factoryDir, result);\n return result;\n } catch (fetchError) {\n // Fall back to stale cache\n const cache = readCache(factoryDir);\n if (cache) {\n return cache.data;\n }\n throw fetchError;\n }\n}\n\n/**\n * Determine the source type from a plugin source string.\n * Pure function — no I/O.\n */\nexport function resolvePluginSource(source: string): PluginSource {\n // Local paths\n if (source.startsWith(\"./\") || source.startsWith(\"/\") || source.startsWith(\"~\")) {\n return { type: \"local\", path: source };\n }\n\n // Git URLs\n if (\n source.includes(\"github.com\") ||\n source.includes(\"gitlab.com\") ||\n source.endsWith(\".git\")\n ) {\n return { type: \"git\", url: source };\n }\n\n // Registry: name or name@version\n if (source.includes(\"@\")) {\n const atIdx = source.lastIndexOf(\"@\");\n const name = source.slice(0, atIdx);\n const version = source.slice(atIdx + 1);\n return { type: \"registry\", name, version };\n }\n\n return { type: \"registry\", name: source };\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { McpServerEntrySchema } from \"./schemas.js\";\nimport type { McpServerEntry } from \"./types.js\";\n\nfunction getMcpServersPath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \"mcp-servers.json\");\n}\n\nfunction readMcpServers(factoryDir: string): Record<string, McpServerEntry> {\n const filePath = getMcpServersPath(factoryDir);\n // Auto-initialize: treat a missing file as an empty registry so the UI\n // (and anything else on a fresh factory) can add the first MCP without\n // hand-editing files.\n if (!existsSync(filePath)) return {};\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return (raw.servers || {}) as Record<string, McpServerEntry>;\n}\n\nfunction writeMcpServers(\n factoryDir: string,\n servers: Record<string, McpServerEntry>\n): void {\n const filePath = getMcpServersPath(factoryDir);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(filePath, JSON.stringify({ servers }, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport function addMcp(\n factoryDir: string,\n name: string,\n entry: {\n command: string;\n args: string[];\n config?: Record<string, unknown>;\n source: string;\n enabled: boolean;\n }\n): void {\n const validated = McpServerEntrySchema.parse(entry);\n const servers = readMcpServers(factoryDir);\n\n if (servers[name]) {\n throw new Error(`MCP server '${name}' already exists. Remove it first or use a different name.`);\n }\n\n servers[name] = validated;\n writeMcpServers(factoryDir, servers);\n}\n\nexport function removeMcp(factoryDir: string, name: string): void {\n const servers = readMcpServers(factoryDir);\n\n if (!servers[name]) {\n throw new Error(`MCP server '${name}' not found.`);\n }\n\n delete servers[name];\n writeMcpServers(factoryDir, servers);\n}\n\nexport function listMcps(\n factoryDir: string\n): Record<string, McpServerEntry> {\n return readMcpServers(factoryDir);\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { HookEntrySchema, HOOK_EVENTS } from \"./schemas.js\";\nimport type { HookEntry, HookEvent } from \"./types.js\";\n\nfunction getHooksPath(factoryDir: string): string {\n return join(factoryDir, \".beastmode\", \"hooks.json\");\n}\n\nfunction validateEvent(event: string): asserts event is HookEvent {\n if (!(HOOK_EVENTS as readonly string[]).includes(event)) {\n throw new Error(\n `Invalid hook event '${event}'. Valid events: ${HOOK_EVENTS.join(\", \")}`\n );\n }\n}\n\nfunction emptyHooks(): Record<HookEvent, HookEntry[]> {\n const out: Record<string, HookEntry[]> = {};\n for (const e of HOOK_EVENTS) out[e] = [];\n return out as Record<HookEvent, HookEntry[]>;\n}\n\nfunction readHooks(\n factoryDir: string\n): Record<HookEvent, HookEntry[]> {\n const filePath = getHooksPath(factoryDir);\n // Auto-initialize: treat a missing file as an empty hook registry so the\n // UI (and anything else on a fresh factory) can add the first hook\n // without hand-editing files.\n if (!existsSync(filePath)) return emptyHooks();\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return (raw.hooks || emptyHooks()) as Record<HookEvent, HookEntry[]>;\n}\n\nfunction writeHooks(\n factoryDir: string,\n hooks: Record<HookEvent, HookEntry[]>\n): void {\n const filePath = getHooksPath(factoryDir);\n const dir = dirname(filePath);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(\n filePath,\n JSON.stringify({ hooks }, null, 2) + \"\\n\",\n \"utf-8\"\n );\n}\n\nexport function addHook(\n factoryDir: string,\n event: HookEvent,\n entry: {\n name: string;\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n source: string;\n }\n): void {\n validateEvent(event);\n const validated = HookEntrySchema.parse(entry);\n const hooks = readHooks(factoryDir);\n\n const eventHooks = hooks[event] || [];\n if (eventHooks.some((h) => h.name === validated.name)) {\n throw new Error(\n `Hook '${validated.name}' already exists on event '${event}'. Remove it first or use a different name.`\n );\n }\n\n eventHooks.push(validated);\n hooks[event] = eventHooks;\n writeHooks(factoryDir, hooks);\n}\n\nexport function removeHook(\n factoryDir: string,\n event: HookEvent,\n name: string\n): void {\n validateEvent(event);\n const hooks = readHooks(factoryDir);\n\n const eventHooks = hooks[event] || [];\n const index = eventHooks.findIndex((h) => h.name === name);\n if (index === -1) {\n throw new Error(\n `Hook '${name}' not found on event '${event}'.`\n );\n }\n\n eventHooks.splice(index, 1);\n hooks[event] = eventHooks;\n writeHooks(factoryDir, hooks);\n}\n\nexport function listHooks(\n factoryDir: string\n): Record<HookEvent, HookEntry[]> {\n return readHooks(factoryDir);\n}\n","import {\n existsSync,\n readFileSync,\n writeFileSync,\n cpSync,\n rmSync,\n mkdirSync,\n} from \"fs\";\nimport { join, resolve } from \"path\";\nimport { parseManifest, checkEngineCompat, mergePluginDefaults } from \"./plugin-resolver.js\";\nimport { addMcp, removeMcp, listMcps } from \"./mcp-manager.js\";\nimport { addHook, removeHook, listHooks } from \"./hook-manager.js\";\nimport { ENGINE_VERSION } from \"./version.js\";\nimport type { PluginManifest, HookEvent } from \"./types.js\";\nimport { HOOK_EVENTS } from \"./schemas.js\";\n\nfunction readLock(factoryDir: string): {\n plugins: Record<string, { version: string; source: string; repo?: string; ref?: string; installed_at: string }>;\n locked_at: string;\n} {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n return { plugins: {}, locked_at: new Date().toISOString() };\n }\n return JSON.parse(readFileSync(lockPath, \"utf-8\"));\n}\n\nfunction writeLock(\n factoryDir: string,\n lock: {\n plugins: Record<string, { version: string; source: string; repo?: string; ref?: string; installed_at: string }>;\n locked_at: string;\n }\n): void {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n lock.locked_at = new Date().toISOString();\n writeFileSync(lockPath, JSON.stringify(lock, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) return {};\n return JSON.parse(readFileSync(configPath, \"utf-8\"));\n}\n\nfunction writeConfig(factoryDir: string, config: Record<string, unknown>): void {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\", \"utf-8\");\n}\n\nfunction registerPluginMcps(\n factoryDir: string,\n pluginName: string,\n pluginDir: string,\n manifest: PluginManifest\n): void {\n const mcpNames = manifest.provides?.mcp_servers || [];\n for (const mcpName of mcpNames) {\n const mcpDefPath = join(pluginDir, \"mcp-servers\", `${mcpName}.json`);\n if (!existsSync(mcpDefPath)) continue;\n\n const mcpDef = JSON.parse(readFileSync(mcpDefPath, \"utf-8\"));\n addMcp(factoryDir, mcpName, {\n command: mcpDef.command,\n args: mcpDef.args || [],\n config: mcpDef.config || {},\n source: `plugin:${pluginName}`,\n enabled: true,\n });\n }\n}\n\nfunction registerPluginHooks(\n factoryDir: string,\n pluginName: string,\n pluginDir: string,\n manifest: PluginManifest\n): void {\n const hookNames = manifest.provides?.hooks || [];\n for (const hookName of hookNames) {\n const hookDefPath = join(pluginDir, \"hooks\", `${hookName}.json`);\n if (!existsSync(hookDefPath)) continue;\n\n const hookDef = JSON.parse(readFileSync(hookDefPath, \"utf-8\"));\n const event = hookDef.event as HookEvent;\n if (!(HOOK_EVENTS as readonly string[]).includes(event)) continue;\n\n addHook(factoryDir, event, {\n name: hookDef.name || hookName,\n command: hookDef.command,\n skill: hookDef.skill,\n webhook: hookDef.webhook,\n config: hookDef.config || {},\n source: `plugin:${pluginName}`,\n });\n }\n}\n\nfunction unregisterPluginMcps(factoryDir: string, pluginName: string): void {\n const servers = listMcps(factoryDir);\n for (const [name, entry] of Object.entries(servers)) {\n if (entry.source === `plugin:${pluginName}`) {\n removeMcp(factoryDir, name);\n }\n }\n}\n\nfunction unregisterPluginHooks(factoryDir: string, pluginName: string): void {\n const allHooks = listHooks(factoryDir);\n for (const event of HOOK_EVENTS) {\n const eventHooks = allHooks[event] || [];\n for (const hook of eventHooks) {\n if (hook.source === `plugin:${pluginName}`) {\n removeHook(factoryDir, event, hook.name);\n }\n }\n }\n}\n\n/**\n * Install a plugin from a local path.\n * Validates manifest, checks engine compat, copies files,\n * registers MCPs/hooks, merges defaults, updates lock.\n */\nexport async function installPlugin(\n factoryDir: string,\n sourcePath: string\n): Promise<void> {\n const resolvedPath = resolve(sourcePath);\n\n // 1. Validate plugin.json exists\n const manifestPath = join(resolvedPath, \"plugin.json\");\n if (!existsSync(manifestPath)) {\n throw new Error(\n `plugin.json not found at ${manifestPath}. Is this a BeastMode plugin directory?`\n );\n }\n\n // 2. Parse and validate manifest\n const rawManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n const manifest = parseManifest(rawManifest);\n\n // 3. Check engine compatibility\n const compat = checkEngineCompat(manifest.engine_version, ENGINE_VERSION);\n if (!compat.compatible) {\n throw new Error(\n `Plugin '${manifest.name}' is not compatible with this engine version. ${compat.reason}`\n );\n }\n\n // 4. Check if already installed\n const lock = readLock(factoryDir);\n if (lock.plugins[manifest.name]) {\n throw new Error(\n `Plugin '${manifest.name}' is already installed. Remove it first with 'beastmode remove plugin ${manifest.name}'.`\n );\n }\n\n // 5. Copy plugin to .beastmode/plugins/<name>/\n const destDir = join(factoryDir, \".beastmode\", \"plugins\", manifest.name);\n mkdirSync(destDir, { recursive: true });\n cpSync(resolvedPath, destDir, { recursive: true });\n\n // 6. Register MCP servers\n registerPluginMcps(factoryDir, manifest.name, destDir, manifest);\n\n // 7. Register hooks\n registerPluginHooks(factoryDir, manifest.name, destDir, manifest);\n\n // 8. Merge config defaults (low priority — existing values preserved)\n if (manifest.config_defaults) {\n const defaultsPath = join(destDir, manifest.config_defaults);\n if (existsSync(defaultsPath)) {\n const defaults = JSON.parse(readFileSync(defaultsPath, \"utf-8\"));\n const currentConfig = readConfig(factoryDir);\n const mergedConfig = mergePluginDefaults(currentConfig, defaults);\n writeConfig(factoryDir, mergedConfig);\n }\n }\n\n // 9. Update extensions.lock\n lock.plugins[manifest.name] = {\n version: manifest.version,\n source: \"local\",\n installed_at: new Date().toISOString(),\n };\n writeLock(factoryDir, lock);\n}\n\n/**\n * Remove an installed plugin. Cleans up MCPs, hooks, files, and lock entry.\n */\nexport function removePlugin(\n factoryDir: string,\n name: string,\n options?: { force?: boolean }\n): void {\n const lock = readLock(factoryDir);\n const force = options?.force ?? false;\n\n // Check if installed\n if (!lock.plugins[name]) {\n throw new Error(\n `Plugin '${name}' is not installed.`\n );\n }\n\n // Check if other plugins depend on this one\n if (!force) {\n const dependents: string[] = [];\n const pluginsDir = join(factoryDir, \".beastmode\", \"plugins\");\n for (const [pluginName, _entry] of Object.entries(lock.plugins)) {\n if (pluginName === name) continue;\n const pluginManifestPath = join(pluginsDir, pluginName, \"plugin.json\");\n if (!existsSync(pluginManifestPath)) continue;\n try {\n const pluginManifest = JSON.parse(readFileSync(pluginManifestPath, \"utf-8\"));\n if (\n Array.isArray(pluginManifest.dependencies) &&\n pluginManifest.dependencies.includes(name)\n ) {\n dependents.push(pluginName);\n }\n } catch {\n // skip unreadable manifests\n }\n }\n if (dependents.length > 0) {\n throw new Error(\n `Cannot remove '${name}': plugins [${dependents.join(\", \")}] depend on it. Use --force to override.`\n );\n }\n }\n\n // Remove plugin's MCP servers\n unregisterPluginMcps(factoryDir, name);\n\n // Remove plugin's hooks\n unregisterPluginHooks(factoryDir, name);\n\n // Delete plugin directory\n const pluginDir = join(factoryDir, \".beastmode\", \"plugins\", name);\n if (existsSync(pluginDir)) {\n rmSync(pluginDir, { recursive: true, force: true });\n }\n\n // Update lock\n delete lock.plugins[name];\n writeLock(factoryDir, lock);\n}\n","import {\n existsSync,\n readdirSync,\n cpSync,\n rmSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n statSync,\n} from \"fs\";\nimport { join, basename } from \"path\";\n\nexport interface SkillInfo {\n name: string;\n description: string;\n source: string; // \"custom\" | \"plugin:<name>\"\n path: string;\n}\n\nfunction parseSkillFrontmatter(content: string): { name?: string; description?: string } {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n const frontmatter: Record<string, string> = {};\n for (const line of match[1].split(\"\\n\")) {\n const colonIdx = line.indexOf(\":\");\n if (colonIdx > 0) {\n const key = line.slice(0, colonIdx).trim();\n const value = line.slice(colonIdx + 1).trim();\n frontmatter[key] = value;\n }\n }\n return frontmatter;\n}\n\nexport function addSkill(factoryDir: string, sourcePath: string): void {\n if (!existsSync(sourcePath)) {\n throw new Error(`Skill source path does not exist: ${sourcePath}`);\n }\n\n const stat = statSync(sourcePath);\n if (!stat.isDirectory()) {\n throw new Error(`Skill source must be a directory: ${sourcePath}`);\n }\n\n const skillMdPath = join(sourcePath, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n throw new Error(\n `SKILL.md not found in ${sourcePath}. Every skill must have a SKILL.md with frontmatter.`\n );\n }\n\n const skillName = basename(sourcePath);\n const destPath = join(factoryDir, \".beastmode\", \"skills\", skillName);\n\n if (existsSync(destPath)) {\n throw new Error(\n `Skill '${skillName}' already exists at ${destPath}. Remove it first.`\n );\n }\n\n cpSync(sourcePath, destPath, { recursive: true });\n}\n\n/**\n * Create a new skill inline from name/description/body (for the UI form).\n *\n * Unlike `addSkill` which copies an existing directory, this one generates\n * a `.beastmode/skills/<slug>/SKILL.md` from raw inputs. Slug is derived\n * from the name (lowercased, non-alnum -> dashes). Fails if the slug\n * already exists — caller should remove the old one first.\n */\nexport function createSkill(\n factoryDir: string,\n name: string,\n description: string,\n body: string,\n): { slug: string; path: string } {\n if (!name.trim()) throw new Error(\"Skill name is required\");\n if (!description.trim()) throw new Error(\"Skill description is required\");\n if (!body.trim()) throw new Error(\"Skill body is required\");\n\n const slug = name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n if (!slug) throw new Error(\"Skill name must contain alphanumeric characters\");\n\n const skillDir = join(factoryDir, \".beastmode\", \"skills\", slug);\n if (existsSync(skillDir)) {\n throw new Error(\n `Skill '${slug}' already exists. Remove it first or pick a different name.`,\n );\n }\n\n mkdirSync(skillDir, { recursive: true });\n\n // Build SKILL.md with YAML frontmatter. Quote values that contain colons.\n const needsQuote = (v: string) => /[:#]/.test(v);\n const q = (v: string) => (needsQuote(v) ? JSON.stringify(v) : v);\n const frontmatter = `---\\nname: ${q(name.trim())}\\ndescription: ${q(description.trim())}\\n---`;\n const content = `${frontmatter}\\n\\n${body.trim()}\\n`;\n writeFileSync(join(skillDir, \"SKILL.md\"), content, \"utf-8\");\n\n return { slug, path: skillDir };\n}\n\nexport function removeSkill(factoryDir: string, name: string): void {\n const skillPath = join(factoryDir, \".beastmode\", \"skills\", name);\n if (!existsSync(skillPath)) {\n throw new Error(`Skill '${name}' not found at ${skillPath}.`);\n }\n rmSync(skillPath, { recursive: true, force: true });\n}\n\nexport function listSkills(factoryDir: string): SkillInfo[] {\n const skills: SkillInfo[] = [];\n const bmDir = join(factoryDir, \".beastmode\");\n\n // Custom skills from .beastmode/skills/\n const customSkillsDir = join(bmDir, \"skills\");\n if (existsSync(customSkillsDir)) {\n for (const entry of readdirSync(customSkillsDir, { withFileTypes: true })) {\n if (!entry.isDirectory() || entry.name.startsWith(\".\")) continue;\n const skillMdPath = join(customSkillsDir, entry.name, \"SKILL.md\");\n if (!existsSync(skillMdPath)) continue;\n\n const frontmatter = parseSkillFrontmatter(\n readFileSync(skillMdPath, \"utf-8\")\n );\n skills.push({\n name: frontmatter.name || entry.name,\n description: frontmatter.description || \"\",\n source: \"custom\",\n path: join(customSkillsDir, entry.name),\n });\n }\n }\n\n // Plugin skills from .beastmode/plugins/*/skills/*/\n const pluginsDir = join(bmDir, \"plugins\");\n if (existsSync(pluginsDir)) {\n for (const pluginEntry of readdirSync(pluginsDir, {\n withFileTypes: true,\n })) {\n if (!pluginEntry.isDirectory() || pluginEntry.name.startsWith(\".\"))\n continue;\n const pluginSkillsDir = join(\n pluginsDir,\n pluginEntry.name,\n \"skills\"\n );\n if (!existsSync(pluginSkillsDir)) continue;\n\n for (const skillEntry of readdirSync(pluginSkillsDir, {\n withFileTypes: true,\n })) {\n if (!skillEntry.isDirectory() || skillEntry.name.startsWith(\".\"))\n continue;\n const skillMdPath = join(\n pluginSkillsDir,\n skillEntry.name,\n \"SKILL.md\"\n );\n if (!existsSync(skillMdPath)) continue;\n\n const frontmatter = parseSkillFrontmatter(\n readFileSync(skillMdPath, \"utf-8\")\n );\n skills.push({\n name: frontmatter.name || skillEntry.name,\n description: frontmatter.description || \"\",\n source: `plugin:${pluginEntry.name}`,\n path: join(pluginSkillsDir, skillEntry.name),\n });\n }\n }\n }\n\n return skills;\n}\n","/**\n * Migrate engine: converts daemon config to factory config format.\n * Pure functions — no I/O. CLI layer handles file reads/writes.\n */\n\nimport type { FactoryConfig, ProjectConfig, FileAction } from \"./types.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"./schemas.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\n// ── Types ──\n\nexport interface DaemonConfigRaw {\n mode?: string;\n task_backend?: string;\n board?: { url?: string };\n github?: {\n project_repo?: string;\n base_branch?: string;\n org?: string;\n infra_repo?: string;\n gitops_repo?: string;\n pr_auto_merge?: boolean;\n };\n ci?: Record<string, unknown>;\n deploy?: Record<string, unknown>;\n repos?: {\n beastmode?: string;\n project?: string;\n infra?: string;\n gitops?: string;\n };\n infra?: Record<string, unknown>;\n verification?: {\n enabled?: boolean;\n satisfaction_threshold?: number;\n timeout_minutes?: number;\n prod_accept_floor?: number;\n };\n convergence?: {\n max_iterations?: number;\n fail_fast_threshold?: number;\n infra_retry_max?: number;\n max_precheck_retries?: number;\n };\n models?: Record<string, unknown>;\n cost?: {\n build_check_enabled?: boolean;\n incremental_verification?: boolean;\n model_tiering_enabled?: boolean;\n [k: string]: unknown;\n };\n retry?: { max_failures?: number };\n healing?: { enabled?: boolean; max_attempts?: number };\n review?: { enabled?: boolean; timeout_minutes?: number };\n stack?: {\n name?: string;\n build_command?: string;\n dev_command?: string;\n test_command?: string;\n install_command?: string;\n dev_port?: number;\n };\n docker?: Record<string, unknown>;\n sre?: Record<string, unknown>;\n concurrency?: Record<string, unknown>;\n}\n\nexport interface ActiveState {\n activeRuns: string[];\n worktrees: string[];\n totalRuns: number;\n}\n\nexport interface MigrationReport {\n factoryName: string;\n projectName: string | null;\n configMappings: Array<{ from: string; to: string; value: unknown }>;\n droppedKeys: string[];\n activeState: ActiveState;\n filesCreated: string[];\n}\n\n// ── Config Parsing ──\n\nexport function parseDaemonConfig(jsonContent: string): DaemonConfigRaw {\n return JSON.parse(jsonContent) as DaemonConfigRaw;\n}\n\n// ── Config Mapping ──\n\nexport function mapDaemonToFactory(daemon: DaemonConfigRaw): {\n factory: FactoryConfig;\n project: ProjectConfig | null;\n} {\n // Map task backend\n let adapter = \"beastmode-board\";\n const taskBackendConfig: Record<string, unknown> = {};\n\n if (daemon.task_backend === \"board\") {\n adapter = \"beastmode-board\";\n if (daemon.board) {\n Object.assign(taskBackendConfig, daemon.board);\n }\n }\n\n // Map models\n const models: Record<string, string> = {};\n if (daemon.models) {\n const m = daemon.models as Record<string, string | null>;\n if (m.spec) models.spec = m.spec;\n if (m.coder_initial) models.coder = m.coder_initial;\n if (m.coder_iteration) models.coder_iteration = m.coder_iteration;\n if (m.verifier) models.verifier = m.verifier;\n if (m.review) models.reviewer = m.review;\n if (m.healing) models.healing = m.healing;\n }\n\n // Build factory config object (let Zod fill defaults)\n const factoryRaw: Record<string, unknown> = {\n pipeline: {\n satisfaction_threshold: daemon.verification?.satisfaction_threshold ?? 0.85,\n prod_accept_floor: daemon.verification?.prod_accept_floor ?? 0.65,\n max_iterations: daemon.convergence?.max_iterations ?? 5,\n fail_fast_threshold: daemon.convergence?.fail_fast_threshold ?? 0.3,\n },\n models: Object.keys(models).length > 0 ? models : undefined,\n task_backend: {\n adapter,\n config: taskBackendConfig,\n },\n resilience: {\n max_failures: daemon.retry?.max_failures ?? 5,\n healing_enabled: daemon.healing?.enabled ?? true,\n healing_max_attempts: daemon.healing?.max_attempts ?? 3,\n },\n cost: {\n model_tiering_enabled: daemon.cost?.model_tiering_enabled ?? true,\n incremental_verification: daemon.cost?.incremental_verification ?? true,\n build_check_enabled: daemon.cost?.build_check_enabled ?? true,\n },\n human_gates: {\n pr_review: daemon.review?.enabled !== false ? \"automated\" : \"disabled\",\n },\n };\n\n // Remove undefined keys\n for (const [k, v] of Object.entries(factoryRaw)) {\n if (v === undefined) delete factoryRaw[k];\n }\n\n const factory = FactoryConfigSchema.parse(factoryRaw) as FactoryConfig;\n\n // Build project config if we have repo/path info\n let project: ProjectConfig | null = null;\n if (daemon.repos?.project || daemon.github?.project_repo) {\n const repoName = daemon.github?.project_repo?.split(\"/\").pop() || \"project\";\n const stack = daemon.stack || {};\n\n const deployConfig: Record<string, unknown> = {};\n if (daemon.deploy) {\n for (const [k, v] of Object.entries(daemon.deploy)) {\n if (v !== null && v !== undefined) {\n deployConfig[k] = v;\n }\n }\n }\n\n const hasDeployConfig = Object.keys(deployConfig).length > 0;\n\n const projectRaw = {\n name: repoName,\n repo: daemon.github?.project_repo || \"\",\n path: daemon.repos?.project || \"\",\n stack: {\n detected: stack.name || \"node\",\n build_command: stack.build_command || \"npm run build\",\n dev_command: stack.dev_command || \"npm run dev\",\n test_command: stack.test_command || \"npm test\",\n install_command: stack.install_command || \"npm install\",\n dev_port: stack.dev_port || 3000,\n },\n deploy: {\n target: hasDeployConfig ? \"aws-ecs\" : \"pr-only\",\n config: deployConfig,\n },\n pipeline: {},\n models: {},\n plugins: [] as string[],\n };\n\n project = ProjectConfigSchema.parse(projectRaw) as ProjectConfig;\n }\n\n return { factory, project };\n}\n\n// ── Active State Inventory ──\n\nexport interface RunCheckpoint {\n run_id?: string;\n current_stage?: string;\n completed_stages?: unknown[];\n iteration_count?: number;\n}\n\nexport function inventoryActiveState(\n runDirs: string[],\n checkpoints: Map<string, RunCheckpoint>,\n worktreeOutput: string\n): ActiveState {\n const terminalStages = [\"done\", \"shipped\", \"failed\", \"stuck\"];\n\n const activeRuns = runDirs.filter((dir) => {\n const cp = checkpoints.get(dir);\n if (!cp || !cp.current_stage) return false;\n const stage = String(cp.current_stage).toLowerCase();\n return !terminalStages.includes(stage);\n });\n\n const worktrees = worktreeOutput\n .split(\"\\n\")\n .filter((line) => line.trim().length > 0)\n .map((line) => line.split(/\\s+/)[0])\n .filter(Boolean);\n\n return {\n activeRuns,\n worktrees,\n totalRuns: runDirs.length,\n };\n}\n\n// ── Migration Generation ──\n\nconst DROPPED_KEYS = [\n \"mode\",\n \"concurrency\",\n \"docker\",\n \"sre\",\n \"ci\",\n \"infra\",\n \"repos.beastmode\",\n \"repos.infra\",\n \"repos.gitops\",\n];\n\nexport function generateMigration(\n factoryName: string,\n daemon: DaemonConfigRaw,\n activeState: ActiveState\n): { files: FileAction[]; report: MigrationReport } {\n const { factory, project } = mapDaemonToFactory(daemon);\n const files: FileAction[] = [];\n const bm = \".beastmode\";\n\n // factory.json\n files.push({\n path: `${bm}/factory.json`,\n content: JSON.stringify(\n {\n factory_name: factoryName,\n engine_version: ENGINE_VERSION,\n schema_version: SCHEMA_VERSION,\n created_at: new Date().toISOString(),\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // config.json\n files.push({\n path: `${bm}/config.json`,\n content: JSON.stringify(factory, null, 2),\n action: \"create\",\n });\n\n // project config\n if (project) {\n files.push({\n path: `${bm}/projects/${project.name}.json`,\n content: JSON.stringify(project, null, 2),\n action: \"create\",\n });\n }\n\n // hooks.json\n files.push({\n path: `${bm}/hooks.json`,\n content: JSON.stringify(\n {\n hooks: {\n \"pre-spec\": [],\n \"post-spec\": [],\n \"pre-plan\": [],\n \"post-plan\": [],\n \"pre-build\": [],\n \"post-build\": [],\n \"pre-verify\": [],\n \"post-verify\": [],\n \"pre-ship\": [],\n \"post-ship\": [],\n \"on-convergence\": [],\n \"on-failure\": [],\n \"on-stuck\": [],\n },\n },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // mcp-servers.json\n files.push({\n path: `${bm}/mcp-servers.json`,\n content: JSON.stringify({ servers: {} }, null, 2),\n action: \"create\",\n });\n\n // extensions.lock\n files.push({\n path: `${bm}/extensions.lock`,\n content: JSON.stringify(\n { plugins: {}, locked_at: new Date().toISOString() },\n null,\n 2\n ),\n action: \"create\",\n });\n\n // board.json\n files.push({\n path: `${bm}/board.json`,\n content: JSON.stringify({ items: [] }, null, 2),\n action: \"create\",\n });\n\n // Empty directories\n for (const dir of [\"plugins\", \"skills\"]) {\n files.push({\n path: `${bm}/${dir}/.gitkeep`,\n content: \"\",\n action: \"create\",\n });\n }\n\n // Build config mappings for report\n const configMappings: MigrationReport[\"configMappings\"] = [];\n\n if (daemon.task_backend) {\n configMappings.push({\n from: \"task_backend\",\n to: \"task_backend.adapter\",\n value: factory.task_backend.adapter,\n });\n }\n if (daemon.verification?.satisfaction_threshold !== undefined) {\n configMappings.push({\n from: \"verification.satisfaction_threshold\",\n to: \"pipeline.satisfaction_threshold\",\n value: factory.pipeline.satisfaction_threshold,\n });\n }\n if (daemon.verification?.prod_accept_floor !== undefined) {\n configMappings.push({\n from: \"verification.prod_accept_floor\",\n to: \"pipeline.prod_accept_floor\",\n value: factory.pipeline.prod_accept_floor,\n });\n }\n if (daemon.convergence?.max_iterations !== undefined) {\n configMappings.push({\n from: \"convergence.max_iterations\",\n to: \"pipeline.max_iterations\",\n value: factory.pipeline.max_iterations,\n });\n }\n\n const report: MigrationReport = {\n factoryName,\n projectName: project?.name || null,\n configMappings,\n droppedKeys: DROPPED_KEYS.filter((k) => {\n const parts = k.split(\".\");\n let obj: unknown = daemon;\n for (const p of parts) {\n if (obj && typeof obj === \"object\" && p in (obj as Record<string, unknown>)) {\n obj = (obj as Record<string, unknown>)[p];\n } else {\n return false;\n }\n }\n return true;\n }),\n activeState,\n filesCreated: files.map((f) => f.path),\n };\n\n return { files, report };\n}\n","/**\n * Bridge engine: generates daemon-compatible config from factory config.\n * Reverse of migrator — maps factory format back to daemon JSON.\n * Pure functions — no I/O.\n */\n\nimport type { FactoryConfig, ProjectConfig } from \"./types.js\";\n\n// ── Types ──\n\nexport interface DaemonJson {\n mode: string;\n task_backend: string;\n board: { url: string };\n github: {\n org: string;\n project_repo: string;\n infra_repo: string | null;\n gitops_repo: string | null;\n base_branch: string;\n pr_auto_merge: boolean;\n };\n ci: {\n provider: string;\n poll_interval_seconds: number;\n timeout_minutes: number;\n };\n deploy: Record<string, unknown>;\n repos: {\n beastmode: string;\n project: string;\n infra: string | null;\n gitops: string | null;\n };\n infra: {\n terraform_dir: string;\n playbooks_dir: string;\n aws_region: string;\n };\n verification: {\n enabled: boolean;\n satisfaction_threshold: number;\n timeout_minutes: number;\n prod_accept_floor: number;\n };\n review: {\n enabled: boolean;\n timeout_minutes: number;\n };\n retry: { max_failures: number };\n healing: { enabled: boolean; max_attempts: number };\n concurrency: { enabled: boolean; max_playwright_sessions: number };\n docker: {\n build_verify_enabled: boolean;\n verify_port: number;\n build_timeout_seconds: number;\n };\n convergence: {\n max_iterations: number;\n fail_fast_threshold: number;\n infra_retry_max: number;\n max_precheck_retries: number;\n };\n models: Record<string, string | null>;\n cost: {\n build_check_enabled: boolean;\n build_check_command: string;\n build_check_timeout_seconds: number;\n incremental_verification: boolean;\n model_tiering_enabled: boolean;\n nlspec_precheck_enabled: boolean;\n nlspec_precheck_model: string;\n };\n sre: Record<string, unknown>;\n stack: {\n name: string;\n build_command: string;\n dev_command: string;\n test_command: string;\n install_command: string;\n dev_port: number;\n };\n}\n\n// ── Generate daemon config ──\n\nexport function generateDaemonConfig(\n factoryConfig: FactoryConfig,\n projectConfig: ProjectConfig | null,\n factoryPath: string\n): Record<string, unknown> {\n const pipeline = factoryConfig.pipeline;\n const models = factoryConfig.models;\n const resilience = factoryConfig.resilience;\n const cost = factoryConfig.cost;\n const taskBackend = factoryConfig.task_backend;\n const humanGates = factoryConfig.human_gates;\n\n // Determine task backend adapter\n const backendAdapter = taskBackend.adapter;\n let taskBackendValue = \"board\";\n if (backendAdapter === \"beastmode-board\") {\n taskBackendValue = \"board\";\n } else {\n taskBackendValue = backendAdapter;\n }\n\n // Board config (env var overrides for Docker)\n const boardUrl =\n process.env.BEASTMODE_BOARD_URL ||\n ((taskBackend.config as Record<string, unknown>)?.url as string) ||\n \"http://127.0.0.1:8080\";\n\n // Project details\n const projectRepo = projectConfig?.repo || \"\";\n const projectPath = projectConfig?.path || \"\";\n const projectOrg = projectRepo.split(\"/\")[0] || \"beastmode-agent\";\n\n // Stack\n const stack = projectConfig?.stack;\n\n // Deploy\n const deployConfig: Record<string, unknown> = {};\n if (projectConfig?.deploy?.config) {\n Object.assign(deployConfig, projectConfig.deploy.config);\n }\n\n // Models mapping: factory -> daemon\n const daemonModels: Record<string, string | null> = {\n coder_initial: models.coder !== \"claude-opus-4-6\" ? models.coder : null,\n coder_iteration: models.coder_iteration,\n verifier: models.verifier,\n review: models.reviewer,\n spec: models.spec !== \"claude-opus-4-6\" ? models.spec : null,\n healing: models.healing,\n };\n\n const result: Record<string, unknown> = {\n mode: \"daemon\",\n task_backend: taskBackendValue,\n board: {\n url: boardUrl,\n },\n github: {\n org: projectOrg,\n project_repo: projectRepo,\n infra_repo: null,\n gitops_repo: null,\n base_branch: \"main\",\n pr_auto_merge: false,\n },\n ci: {\n provider: \"github-actions\",\n poll_interval_seconds: 30,\n timeout_minutes: 30,\n },\n deploy: Object.keys(deployConfig).length > 0 ? deployConfig : {\n ecr_repository: null,\n ecs_cluster: null,\n ecs_service: null,\n health_check_url: null,\n },\n repos: {\n beastmode: factoryPath,\n project: projectPath,\n infra: null,\n gitops: null,\n },\n infra: {\n terraform_dir: \"infra\",\n playbooks_dir: \"infra/playbooks\",\n aws_region: \"us-east-1\",\n },\n verification: {\n enabled: true,\n satisfaction_threshold: pipeline.satisfaction_threshold,\n timeout_minutes: 30,\n prod_accept_floor: pipeline.prod_accept_floor,\n },\n review: {\n enabled: humanGates.pr_review !== \"disabled\",\n timeout_minutes: 15,\n },\n retry: {\n max_failures: resilience.max_failures,\n },\n healing: {\n enabled: resilience.healing_enabled,\n max_attempts: resilience.healing_max_attempts,\n },\n concurrency: {\n enabled: true,\n max_playwright_sessions: 1,\n },\n docker: {\n build_verify_enabled: true,\n verify_port: 3001,\n build_timeout_seconds: 600,\n },\n convergence: {\n max_iterations: pipeline.max_iterations,\n fail_fast_threshold: pipeline.fail_fast_threshold,\n infra_retry_max: 3,\n max_precheck_retries: 2,\n },\n models: daemonModels,\n cost: {\n build_check_enabled: cost.build_check_enabled,\n build_check_command: stack?.build_command || \"npm run build\",\n build_check_timeout_seconds: 180,\n incremental_verification: cost.incremental_verification,\n model_tiering_enabled: cost.model_tiering_enabled,\n nlspec_precheck_enabled: true,\n nlspec_precheck_model: \"claude-haiku-4-5-20251001\",\n },\n sre: {\n enabled: false,\n },\n stack: {\n name: stack?.detected || \"node\",\n build_command: stack?.build_command || \"npm run build\",\n dev_command: stack?.dev_command || \"npm run dev\",\n test_command: stack?.test_command || \"npm test\",\n install_command: stack?.install_command || \"npm install\",\n dev_port: stack?.dev_port || 3000,\n },\n };\n\n return result;\n}\n\n// ── Find Python Daemon ──\n\nexport interface DaemonLocation {\n command: string;\n args: string[];\n}\n\nexport function findPythonDaemonPaths(\n envPath: string | undefined,\n factoryPath: string\n): string[] {\n const paths: string[] = [];\n\n // 1. BEASTMODE_DAEMON_PATH env var\n if (envPath) {\n paths.push(envPath);\n }\n\n // 2. Relative to factory path (common layout: factory/../daemon)\n paths.push(`${factoryPath}/daemon`);\n paths.push(`${factoryPath}/../daemon`);\n\n return paths;\n}\n\nexport function buildDaemonCommand(\n daemonPath: string | null,\n configPath: string,\n options: { dryRun?: boolean; logLevel?: string } = {}\n): { command: string; args: string[] } {\n const args: string[] = [];\n\n if (daemonPath) {\n args.push(\"-m\", \"beastmode_daemon\");\n } else {\n args.push(\"-m\", \"beastmode_daemon\");\n }\n\n args.push(\"--config\", configPath);\n\n if (options.dryRun) {\n args.push(\"--dry-run\");\n }\n\n if (options.logLevel) {\n args.push(\"--log-level\", options.logLevel);\n }\n\n return {\n command: \"python\",\n args,\n };\n}\n","// Methodology Integration — engine modules\nexport { getStageProvider, validateProvider, listProviders, parseMethodologyManifest } from \"./provider-manager.js\";\nexport { resolveImportAdapter, runImportAdapter } from \"./import-adapter.js\";\nexport { resolveExportAdapter, runExportAdapter } from \"./export-adapter.js\";\nexport { importPrd, importUserStories, importRfc, importTestCases, exportMarkdown } from \"./builtin-adapters.js\";\nexport type { ProviderInfo, BuiltinProviderInfo, PluginProviderInfo, ProviderValidationResult } from \"./provider-manager.js\";\nexport type { ImportAdapterRef, BuiltinImportAdapterRef, PluginImportAdapterRef } from \"./import-adapter.js\";\nexport type { ExportAdapterRef, BuiltinExportAdapterRef, PluginExportAdapterRef } from \"./export-adapter.js\";\n\n// Config Engine — pure logic, no I/O\nexport { detectStack } from \"./stack-detector.js\";\nexport { PRESETS, getPreset, listPresets } from \"./presets.js\";\nexport { resolveDefaults, resolveProject } from \"./default-resolver.js\";\nexport { validateSecrets } from \"./secret-validator.js\";\nexport { scaffoldFactory } from \"./scaffold-generator.js\";\nexport { parseTemplate } from \"./template-importer.js\";\nexport { validateFactory } from \"./config-validator.js\";\nexport { ENGINE_VERSION, SCHEMA_VERSION } from \"./version.js\";\n\n// Lifecycle — status, config, doctor, upgrade\nexport { collectStatus } from \"./status-checker.js\";\nexport type { StatusInput, FactoryStatus } from \"./status-checker.js\";\nexport { configGet, configSet, configReset, coerceValue, generateDefaults } from \"./config-manager.js\";\nexport { runDiagnostics } from \"./doctor.js\";\nexport type { DoctorInput, DoctorCheck, DoctorReport } from \"./doctor.js\";\nexport { checkUpgrade, performUpgrade } from \"./upgrader.js\";\nexport type { UpgradeCheck, UpgradeResult } from \"./upgrader.js\";\n\n// Extension System — engine modules\nexport { parseManifest, checkEngineCompat, resolveDependencies, mergePluginDefaults } from \"./plugin-resolver.js\";\nexport { fetchRegistryIndex, resolvePluginSource } from \"./plugin-registry.js\";\nexport { installPlugin, removePlugin } from \"./plugin-installer.js\";\nexport { addMcp, removeMcp, listMcps } from \"./mcp-manager.js\";\nexport { addHook, removeHook, listHooks } from \"./hook-manager.js\";\nexport { addSkill, createSkill, removeSkill, listSkills } from \"./skill-manager.js\";\n\nexport {\n FactoryConfigSchema,\n ProjectConfigSchema,\n FactoryIdentitySchema,\n PipelineConfigSchema,\n ModelsConfigSchema,\n TaskBackendConfigSchema,\n StageConfigSchema,\n StackConfigSchema,\n DeployConfigSchema,\n PluginManifestSchema,\n McpServerEntrySchema,\n HookEntrySchema,\n RegistryIndexSchema,\n RegistryEntrySchema,\n ExtensionsLockSchema,\n LockEntrySchema,\n HookEventSchema,\n HOOK_EVENTS,\n MethodologyManifestSchema,\n ProviderEntrySchema,\n ImportAdapterEntrySchema,\n ExportAdapterEntrySchema,\n MethodologyPresetEntrySchema,\n PROVIDER_CONTRACTS,\n PIPELINE_STAGES,\n ARTIFACT_TYPES,\n} from \"./schemas.js\";\nexport type {\n FactoryConfig,\n ProjectConfig,\n FactoryIdentity,\n StackInfo,\n FileAction,\n ConfigDelta,\n ValidationError,\n SecretReport,\n SecretRequirement,\n PluginManifest,\n McpServerEntry,\n HookEntry,\n RegistryIndex,\n RegistryEntry,\n ExtensionsLock,\n LockEntry,\n HookEvent,\n MethodologyManifest,\n ProviderEntry,\n ImportAdapterEntry,\n ExportAdapterEntry,\n MethodologyPresetEntry,\n} from \"./types.js\";\nexport type { SkillInfo } from \"./skill-manager.js\";\nexport type { PluginSource } from \"./plugin-registry.js\";\n\n// Migrator + Bridge — daemon config translation\nexport {\n parseDaemonConfig,\n mapDaemonToFactory,\n inventoryActiveState,\n generateMigration,\n} from \"./migrator.js\";\nexport type {\n DaemonConfigRaw,\n ActiveState,\n MigrationReport,\n RunCheckpoint,\n} from \"./migrator.js\";\nexport {\n generateDaemonConfig,\n findPythonDaemonPaths,\n buildDaemonCommand,\n} from \"./bridge.js\";\nexport type { DaemonLocation } from \"./bridge.js\";\n","import { mkdirSync, writeFileSync, appendFileSync, existsSync } from \"fs\";\nimport { dirname } from \"path\";\nimport type { FileAction } from \"../../engine/types.js\";\n\nexport function executeFileActions(actions: FileAction[]): void {\n for (const action of actions) {\n const dir = dirname(action.path);\n mkdirSync(dir, { recursive: true });\n\n switch (action.action) {\n case \"create\":\n if (existsSync(action.path)) {\n throw new Error(`File already exists: ${action.path}`);\n }\n writeFileSync(action.path, action.content, \"utf-8\");\n break;\n case \"overwrite\":\n writeFileSync(action.path, action.content, \"utf-8\");\n break;\n case \"append\":\n appendFileSync(action.path, action.content, \"utf-8\");\n break;\n }\n }\n}\n","import chalk from \"chalk\";\n\nexport function header(text: string): void {\n console.log();\n console.log(chalk.bold.cyan(` ${text}`));\n console.log(chalk.dim(\" \" + \"─\".repeat(text.length + 2)));\n}\n\nexport function success(text: string): void {\n console.log(chalk.green(` ✓ ${text}`));\n}\n\nexport function warn(text: string): void {\n console.log(chalk.yellow(` ⚠ ${text}`));\n}\n\nexport function error(text: string): void {\n console.log(chalk.red(` ✗ ${text}`));\n}\n\nexport function info(text: string): void {\n console.log(chalk.dim(` ${text}`));\n}\n\nexport function step(n: number, total: number, text: string): void {\n console.log();\n console.log(chalk.bold(` [${n}/${total}] ${text}`));\n}\n","import {\n detectStack,\n listPresets,\n getPreset,\n resolveDefaults,\n validateSecrets,\n scaffoldFactory,\n ENGINE_VERSION,\n} from \"../../engine/index.js\";\nimport { executeFileActions } from \"../utils/file-writer.js\";\nimport { resolve, basename } from \"path\";\nimport { existsSync, writeFileSync } from \"fs\";\nimport type { StackInfo } from \"../../engine/types.js\";\n\nexport interface Route {\n method: \"GET\" | \"POST\";\n path: string;\n handler: (body?: unknown) => Promise<unknown> | unknown;\n}\n\nconst DEPLOY_TARGETS = [\n \"pr-only\",\n \"vercel\",\n \"aws-ecs\",\n \"aws-lambda\",\n \"gcp-cloud-run\",\n \"kubernetes\",\n \"docker-compose\",\n \"static-host\",\n \"custom\",\n];\n\nconst TASK_BACKENDS = [\n { value: \"beastmode-board\", label: \"BeastMode Board (built-in, zero setup)\" },\n { value: \"github-issues\", label: \"GitHub Issues\" },\n { value: \"linear\", label: \"Linear (requires plugin)\" },\n { value: \"jira\", label: \"Jira (requires plugin)\" },\n];\n\nexport function getRoutes(): Route[] {\n return [\n {\n method: \"GET\",\n path: \"/api/health\",\n handler: () => ({ status: \"ok\", version: ENGINE_VERSION, service: \"beastmode-board\" }),\n },\n {\n method: \"POST\",\n path: \"/api/detect-stack\",\n handler: (body) => {\n const { path: projectPath } = body as { path: string };\n if (!projectPath) throw new Error(\"Missing required field: path\");\n const resolved = resolve(projectPath);\n if (!existsSync(resolved)) throw new Error(`Directory not found: ${resolved}`);\n return detectStack(resolved);\n },\n },\n {\n method: \"GET\",\n path: \"/api/presets\",\n handler: () => {\n return listPresets().map((name) => {\n const preset = getPreset(name);\n return {\n name,\n description: preset.description,\n satisfaction_threshold: preset.satisfaction_threshold,\n max_iterations: preset.max_iterations,\n };\n });\n },\n },\n {\n method: \"GET\",\n path: \"/api/deploy-targets\",\n handler: () => DEPLOY_TARGETS,\n },\n {\n method: \"GET\",\n path: \"/api/task-backends\",\n handler: () => TASK_BACKENDS,\n },\n {\n method: \"POST\",\n path: \"/api/validate-secrets\",\n handler: (body) => {\n const { config, env, context } = body as {\n config: Record<string, unknown>;\n env: Record<string, string>;\n context: { deploy_target?: string };\n };\n if (!config) throw new Error(\"Missing required field: config\");\n // Merge server env with provided env (server env has lower priority)\n const mergedEnv = { ...(process.env as Record<string, string>), ...env };\n const resolvedConfig = resolveDefaults(config, { suggested_preset: \"lean\" } as StackInfo);\n return validateSecrets(resolvedConfig, mergedEnv, context || {});\n },\n },\n {\n method: \"POST\",\n path: \"/api/resolve-defaults\",\n handler: (body) => {\n const { partial, stack } = body as {\n partial: Record<string, unknown>;\n stack: StackInfo;\n };\n if (!partial) throw new Error(\"Missing required field: partial\");\n if (!stack) throw new Error(\"Missing required field: stack\");\n return resolveDefaults(partial, stack);\n },\n },\n {\n method: \"POST\",\n path: \"/api/scaffold\",\n handler: (body) => {\n const { name, config, project, secrets } = body as {\n name: string;\n config: Record<string, unknown>;\n project: {\n name: string;\n repo?: string;\n path: string;\n stack: StackInfo;\n deploy_target?: string;\n };\n secrets?: Record<string, string>;\n };\n\n if (!name) throw new Error(\"Missing required field: name\");\n if (!config) throw new Error(\"Missing required field: config\");\n if (!project) throw new Error(\"Missing required field: project\");\n\n // Check factory doesn't already exist\n if (existsSync(name) && existsSync(resolve(name, \".beastmode\"))) {\n throw new Error(`Factory already exists at ./${name}. Use 'beastmode config' to modify.`);\n }\n\n // Resolve the full config\n const resolvedConfig = resolveDefaults(config, project.stack);\n\n // Scaffold\n const actions = scaffoldFactory(name, resolvedConfig, {\n name: project.name,\n repo: project.repo,\n path: project.path,\n stack: project.stack,\n deploy_target: project.deploy_target,\n });\n\n executeFileActions(actions);\n\n // Write secrets if provided\n if (secrets && Object.keys(secrets).length > 0) {\n const secretLines = Object.entries(secrets)\n .filter(([, val]) => val)\n .map(([key, val]) => `${key}=${val}`);\n if (secretLines.length > 0) {\n const secretsPath = resolve(name, \".beastmode\", \"secrets.env.local\");\n const secretsContent =\n \"# BeastMode secrets — DO NOT COMMIT\\n\" + secretLines.join(\"\\n\") + \"\\n\";\n writeFileSync(secretsPath, secretsContent, \"utf-8\");\n }\n }\n\n const fileList = actions\n .filter((a) => !a.path.endsWith(\".gitkeep\"))\n .map((a) => a.path.replace(`${name}/`, \"\"));\n\n return {\n success: true,\n files: fileList,\n factory_path: resolve(name),\n };\n },\n },\n ];\n}\n","import { existsSync, mkdirSync, readdirSync, renameSync, readFileSync, statSync, writeFileSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\n\nexport function archiveOldRuns(runsDir: string, archiveAfterDays: number): { archived: number } {\n if (archiveAfterDays <= 0 || !existsSync(runsDir)) return { archived: 0 };\n\n const archiveDir = join(runsDir, \".archive\");\n const cutoff = Date.now() - archiveAfterDays * 24 * 60 * 60 * 1000;\n let archived = 0;\n\n for (const entry of readdirSync(runsDir)) {\n if (entry.startsWith(\".\") || !entry.startsWith(\"run-\")) continue;\n const runDir = join(runsDir, entry);\n\n // Skip if pinned\n if (existsSync(join(runDir, \"pinned\"))) continue;\n\n // Check if completed (has checkpoint with stage \"done\" or \"ship\")\n const cpPath = join(runDir, \"checkpoint.json\");\n if (!existsSync(cpPath)) continue;\n try {\n const cp = JSON.parse(readFileSync(cpPath, \"utf-8\"));\n const stage = (cp.current_stage || \"\").toLowerCase();\n if (stage !== \"done\" && stage !== \"ship\") continue;\n } catch { continue; }\n\n // Check age\n try {\n const mtime = statSync(cpPath).mtimeMs;\n if (mtime > cutoff) continue;\n } catch { continue; }\n\n // Archive it\n mkdirSync(archiveDir, { recursive: true });\n renameSync(runDir, join(archiveDir, entry));\n archived++;\n }\n\n return { archived };\n}\n\nexport function pinRun(runsDir: string, runId: string): boolean {\n const runDir = join(runsDir, runId);\n if (!existsSync(runDir)) return false;\n writeFileSync(join(runDir, \"pinned\"), new Date().toISOString());\n return true;\n}\n\nexport function unpinRun(runsDir: string, runId: string): boolean {\n const pinFile = join(runsDir, runId, \"pinned\");\n if (!existsSync(pinFile)) return false;\n unlinkSync(pinFile);\n return true;\n}\n\nexport function isRunPinned(runsDir: string, runId: string): boolean {\n return existsSync(join(runsDir, runId, \"pinned\"));\n}\n","// cli/src/cli/ui/inception.ts\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// ── Types ──\n\nexport interface PhaseState {\n id: string;\n name: string;\n status: \"pending\" | \"in_progress\" | \"approved\";\n artifact: string;\n approvedAt?: string;\n}\n\nexport interface InceptionState {\n productName: string;\n idea: string;\n methodology: string;\n interactionMode: \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\";\n currentPhase: number;\n phases: PhaseState[];\n status: string;\n createdAt: string;\n projectName: string | null;\n}\n\nexport interface MethodologyPhase {\n id: string;\n name: string;\n agent_role: string;\n description: string;\n artifact: string;\n artifact_details_dir?: string;\n prompt_template: string;\n}\n\nexport interface Methodology {\n id: string;\n name: string;\n description: string;\n phases: MethodologyPhase[];\n}\n\n// ── Methodology Loading ──\n\nfunction getMethodologiesDir(): string {\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"methodologies\"),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"methodologies\"),\n join(process.cwd(), \"src\", \"cli\", \"ui\", \"methodologies\"),\n join(process.cwd(), \"dist\", \"methodologies\"),\n join(process.cwd(), \"cli\", \"src\", \"cli\", \"ui\", \"methodologies\"),\n join(process.cwd(), \"cli\", \"dist\", \"methodologies\"),\n ];\n for (const dir of candidates) {\n if (existsSync(dir)) return dir;\n }\n return candidates[0]; // return first candidate even if missing — will fail gracefully\n}\n\nexport function getMethodology(id: string): Methodology {\n const dir = getMethodologiesDir();\n const filePath = join(dir, `${id.replace(/_/g, \"-\")}.json`);\n if (!existsSync(filePath)) {\n throw new Error(`Methodology not found: ${id}`);\n }\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as Methodology;\n}\n\nexport function listMethodologies(): Array<{ id: string; name: string; description: string }> {\n const dir = getMethodologiesDir();\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n const m = JSON.parse(readFileSync(join(dir, f), \"utf-8\"));\n return { id: m.id, name: m.name, description: m.description };\n } catch {\n return null;\n }\n })\n .filter(Boolean) as Array<{ id: string; name: string; description: string }>;\n}\n\n// ── Product Directory ──\n\nfunction getProductDir(factoryDir: string, productName: string): string {\n return join(factoryDir, \".beastmode\", \"products\", productName);\n}\n\n// ── State Management ──\n\nexport function createInceptionState(\n factoryDir: string,\n opts: {\n productName: string;\n idea: string;\n methodology: string;\n interactionMode: \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\";\n },\n): InceptionState {\n const methodology = getMethodology(opts.methodology);\n const productDir = getProductDir(factoryDir, opts.productName);\n mkdirSync(productDir, { recursive: true });\n\n const state: InceptionState = {\n productName: opts.productName,\n idea: opts.idea,\n methodology: opts.methodology,\n interactionMode: opts.interactionMode,\n currentPhase: 0,\n phases: methodology.phases.map((p) => ({\n id: p.id,\n name: p.name,\n status: \"pending\" as const,\n artifact: p.artifact,\n })),\n status: `phase_0_pending`,\n createdAt: new Date().toISOString(),\n projectName: null,\n };\n\n writeFileSync(join(productDir, \"inception.json\"), JSON.stringify(state, null, 2) + \"\\n\");\n return state;\n}\n\nexport function loadInception(factoryDir: string, productName: string): InceptionState | null {\n const filePath = join(getProductDir(factoryDir, productName), \"inception.json\");\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\")) as InceptionState;\n } catch {\n return null;\n }\n}\n\nexport function saveInceptionState(factoryDir: string, state: InceptionState): void {\n const productDir = getProductDir(factoryDir, state.productName);\n writeFileSync(join(productDir, \"inception.json\"), JSON.stringify(state, null, 2) + \"\\n\");\n}\n\nexport function advancePhase(factoryDir: string, productName: string): InceptionState {\n const state = loadInception(factoryDir, productName);\n if (!state) throw new Error(`No inception found for: ${productName}`);\n\n const current = state.phases[state.currentPhase];\n current.status = \"approved\";\n current.approvedAt = new Date().toISOString();\n\n if (state.currentPhase < state.phases.length - 1) {\n state.currentPhase++;\n state.phases[state.currentPhase].status = \"in_progress\";\n state.status = `phase_${state.currentPhase}_in_progress`;\n } else {\n state.status = \"completed\";\n }\n\n saveInceptionState(factoryDir, state);\n return state;\n}\n\nexport function saveArtifact(\n factoryDir: string,\n productName: string,\n filename: string,\n content: string,\n): void {\n const productDir = getProductDir(factoryDir, productName);\n mkdirSync(productDir, { recursive: true });\n // Support subdirectories (e.g., epic-details/epic-01.md)\n const filePath = join(productDir, filename);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n}\n\nexport function loadArtifact(factoryDir: string, productName: string, filename: string): string | null {\n const filePath = join(getProductDir(factoryDir, productName), filename);\n if (!existsSync(filePath)) return null;\n return readFileSync(filePath, \"utf-8\");\n}\n\nexport function migrateInceptionToSession(factoryDir: string, productName: string): boolean {\n const productDir = join(factoryDir, \".beastmode\", \"products\", productName);\n const oldInception = join(productDir, \"inception.json\");\n if (!existsSync(oldInception)) return false;\n\n // Already migrated?\n const sessionsDir = join(productDir, \"sessions\");\n if (existsSync(sessionsDir) && readdirSync(sessionsDir).some(d => d.startsWith(\"session-\"))) {\n return false;\n }\n\n // Create session-001 from existing flat inception\n const sessionDir = join(sessionsDir, \"session-001\");\n mkdirSync(sessionDir, { recursive: true });\n\n // Move inception.json\n const content = readFileSync(oldInception, \"utf-8\");\n writeFileSync(join(sessionDir, \"inception.json\"), content);\n\n // Move any artifacts (prd.md, architecture.md, etc.)\n const artifactFiles = [\"prd.md\", \"architecture.md\", \"discovery-report.md\", \"lean-canvas.md\",\n \"mvp-spec.md\", \"brd.md\", \"technical-spec.md\", \"epics.json\", \"project-plan.md\"];\n for (const file of artifactFiles) {\n const src = join(productDir, file);\n if (existsSync(src)) {\n writeFileSync(join(sessionDir, file), readFileSync(src, \"utf-8\"));\n unlinkSync(src);\n }\n }\n\n // Remove old inception.json (now in session dir)\n unlinkSync(oldInception);\n\n return true;\n}\n\nexport function listProducts(\n factoryDir: string,\n): Array<{ name: string; methodology: string; status: string; currentPhase: number }> {\n const productsDir = join(factoryDir, \".beastmode\", \"products\");\n if (!existsSync(productsDir)) return [];\n return readdirSync(productsDir)\n .filter((d) => existsSync(join(productsDir, d, \"inception.json\")))\n .map((d) => {\n try {\n const state = JSON.parse(readFileSync(join(productsDir, d, \"inception.json\"), \"utf-8\"));\n return {\n name: state.productName || d,\n methodology: state.methodology || \"unknown\",\n status: state.status || \"unknown\",\n currentPhase: state.currentPhase || 0,\n };\n } catch {\n return null;\n }\n })\n .filter(Boolean) as Array<{ name: string; methodology: string; status: string; currentPhase: number }>;\n}\n\n// ── Epic Creation Handoff ──\n\nexport async function createEpicsOnBoard(\n factoryDir: string,\n productName: string,\n boardUrl: string = \"http://127.0.0.1:8080\",\n): Promise<{ created: number; projectName: string }> {\n const state = loadInception(factoryDir, productName);\n if (!state) throw new Error(`No inception found: ${productName}`);\n\n // Load epics.json\n const epicsContent = loadArtifact(factoryDir, productName, \"epics.json\");\n if (!epicsContent) throw new Error(\"No epics.json found — decomposition phase not complete\");\n\n let epics: Array<{\n id: string;\n name: string;\n description: string;\n complexity: string;\n depends_on: string[];\n order: number;\n }>;\n try {\n epics = JSON.parse(epicsContent);\n } catch {\n throw new Error(\"Invalid epics.json format\");\n }\n\n // Sort by order\n epics.sort((a, b) => a.order - b.order);\n\n const http = await import(\"http\");\n const createdIds: string[] = [];\n\n for (const epic of epics) {\n // Load detailed spec if available\n const detailContent = loadArtifact(factoryDir, productName, `epic-details/${epic.id}.md`) || epic.description;\n\n // Create board item\n const payload = JSON.stringify({\n name: epic.name,\n status: \"Ready\",\n task_type: \"epic\",\n priority: epic.complexity === \"XL\" ? \"Critical\" : epic.complexity === \"L\" ? \"High\" : epic.complexity === \"M\" ? \"Medium\" : \"Low\",\n });\n\n let itemId = \"\";\n try {\n const itemResult = await new Promise<Record<string, unknown>>((resolve, reject) => {\n const url = new URL(\"/api/items\", boardUrl);\n const req = http.default.request(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(payload).toString() },\n }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => { try { resolve(JSON.parse(data)); } catch { reject(new Error(data)); } });\n });\n req.on(\"error\", reject);\n req.end(payload);\n });\n\n itemId = String(itemResult.id || \"\");\n } catch {\n // If one epic fails, continue with the rest\n continue;\n }\n\n if (itemId) {\n createdIds.push(itemId);\n\n // Post the detailed spec as the first update\n const updatePayload = JSON.stringify({ body: detailContent, creator_name: \"beastmode-inception\" });\n await new Promise<void>((resolve) => {\n const url = new URL(`/api/items/${itemId}/updates`, boardUrl);\n const req = http.default.request(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(updatePayload).toString() },\n }, () => resolve());\n req.on(\"error\", () => resolve());\n req.end(updatePayload);\n });\n }\n }\n\n // Update inception state\n state.projectName = productName;\n state.status = \"epics_created\";\n saveInceptionState(factoryDir, state);\n\n return { created: createdIds.length, projectName: productName };\n}\n\n// ── Interaction Mode Instructions ──\n\nexport function getInteractionInstructions(mode: string): string {\n switch (mode) {\n case \"interactive\":\n return \"INTERACTIVE MODE: Ask the user questions ONE AT A TIME to deeply understand their needs. Wait for their answer before proceeding. Use Socratic questioning to draw out requirements they haven't thought of. Build the artifact incrementally through dialogue. When you have enough information, present a draft and ask for feedback.\";\n case \"semi_autonomous\":\n return \"SEMI-AUTONOMOUS MODE: Generate a complete draft based on the product idea. Present it to the user as a finished document. Ask if they want to modify anything. Iterate based on their feedback until they approve.\";\n case \"fully_autonomous\":\n return \"FULLY AUTONOMOUS MODE: Generate the complete artifact without stopping to ask questions. Make reasonable product decisions based on the idea description. Present the final output for review.\";\n default:\n return \"\";\n }\n}\n\n// ── Prompt Building ──\n\nexport function buildPhasePrompt(\n state: InceptionState,\n artifacts: Record<string, string>,\n): string {\n const methodology = getMethodology(state.methodology);\n const phase = methodology.phases[state.currentPhase];\n\n let prompt = phase.prompt_template;\n\n // Replace template variables\n prompt = prompt.replace(/\\{idea\\}/g, state.idea);\n prompt = prompt.replace(/\\{interaction_mode\\}/g, state.interactionMode);\n prompt = prompt.replace(/\\{interaction_instructions\\}/g, getInteractionInstructions(state.interactionMode));\n\n // Replace artifact references\n for (const [key, content] of Object.entries(artifacts)) {\n const varName = key.replace(/[-\\.]/g, \"_\").replace(/\\.md$/, \"\");\n prompt = prompt.replace(new RegExp(`\\\\{${varName}\\\\}`, \"g\"), content || \"(not yet available)\");\n }\n\n // Replace any remaining unreplaced variables with \"(not yet available)\"\n prompt = prompt.replace(/\\{[a-z_]+\\}/g, \"(not yet available)\");\n\n return prompt;\n}\n","// cli/src/cli/ui/strategy.ts\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport { getMethodology } from \"./inception.js\";\n\n// ── Types ──\n\nexport interface StrategySession {\n sessionId: string;\n name: string;\n idea: string;\n methodology: string;\n interactionMode: string;\n status: string;\n currentPhase: number;\n phases: Array<{ id: string; name: string; status: string; artifact: string }>;\n createdAt: string;\n updatedAt: string;\n buildOnSession?: string;\n sessionType?: string; // feature, architecture, refactor, product, review, free-form\n approach?: string; // auto, superpowers, bmad, lean-startup, design-thinking, traditional-prd\n}\n\nexport interface ArtifactEntry {\n type: \"brownfield\" | \"strategy_session\" | \"nlspec\" | \"satisfaction\" | \"learning\";\n path: string;\n summary: string;\n date: string;\n sessionId?: string;\n runId?: string;\n}\n\nexport interface ArtifactIndex {\n project: string;\n builtAt: string;\n artifacts: ArtifactEntry[];\n stats: {\n totalSessions: number;\n totalRuns: number;\n activeLearnings: number;\n };\n}\n\n// ── Strategy Space ──\n\nfunction getProductDir(factoryDir: string, projectName: string): string {\n return join(factoryDir, \".beastmode\", \"products\", projectName);\n}\n\nfunction getSessionsDir(factoryDir: string, projectName: string): string {\n return join(getProductDir(factoryDir, projectName), \"sessions\");\n}\n\nfunction nextSessionId(factoryDir: string, projectName: string): string {\n const sessionsDir = getSessionsDir(factoryDir, projectName);\n if (!existsSync(sessionsDir)) return \"session-001\";\n const existing = readdirSync(sessionsDir)\n .filter(d => d.startsWith(\"session-\"))\n .sort();\n if (existing.length === 0) return \"session-001\";\n const lastNum = parseInt(existing[existing.length - 1].replace(\"session-\", \"\"), 10);\n return `session-${String(lastNum + 1).padStart(3, \"0\")}`;\n}\n\nexport function createStrategySession(\n factoryDir: string,\n projectName: string,\n opts: {\n name: string;\n idea: string;\n methodology: string;\n interactionMode: string;\n buildOnSession?: string;\n sessionType?: string;\n approach?: string;\n },\n): StrategySession {\n const methodology = getMethodology(opts.methodology);\n\n const sessionId = nextSessionId(factoryDir, projectName);\n const sessionDir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(sessionDir, { recursive: true });\n\n const session: StrategySession = {\n sessionId,\n name: opts.name,\n idea: opts.idea,\n methodology: opts.methodology,\n interactionMode: opts.interactionMode,\n status: \"phase_0_pending\",\n currentPhase: 0,\n phases: methodology.phases.map((p: { id: string; name: string; artifact: string }) => ({\n id: p.id,\n name: p.name,\n status: \"pending\",\n artifact: p.artifact,\n })),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n buildOnSession: opts.buildOnSession,\n sessionType: opts.sessionType || \"free-form\",\n approach: opts.approach || \"auto\",\n };\n\n writeFileSync(join(sessionDir, \"inception.json\"), JSON.stringify(session, null, 2) + \"\\n\");\n return session;\n}\n\nexport function listStrategySessions(\n factoryDir: string,\n projectName: string,\n): StrategySession[] {\n const sessionsDir = getSessionsDir(factoryDir, projectName);\n if (!existsSync(sessionsDir)) return [];\n return readdirSync(sessionsDir)\n .filter(d => d.startsWith(\"session-\"))\n .sort()\n .map(d => {\n const file = join(sessionsDir, d, \"inception.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf-8\")) as StrategySession;\n } catch {\n return null;\n }\n })\n .filter(Boolean) as StrategySession[];\n}\n\nexport function loadStrategySession(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n): StrategySession | null {\n const file = join(getSessionsDir(factoryDir, projectName), sessionId, \"inception.json\");\n if (!existsSync(file)) return null;\n try {\n return JSON.parse(readFileSync(file, \"utf-8\")) as StrategySession;\n } catch {\n return null;\n }\n}\n\nexport function saveStrategySession(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n session: StrategySession,\n): void {\n const dir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(dir, { recursive: true });\n session.updatedAt = new Date().toISOString();\n writeFileSync(join(dir, \"inception.json\"), JSON.stringify(session, null, 2) + \"\\n\");\n}\n\nexport function saveSessionArtifact(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n filename: string,\n content: string,\n): void {\n const dir = join(getSessionsDir(factoryDir, projectName), sessionId);\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, filename), content);\n}\n\nexport function loadSessionArtifact(\n factoryDir: string,\n projectName: string,\n sessionId: string,\n filename: string,\n): string | null {\n const file = join(getSessionsDir(factoryDir, projectName), sessionId, filename);\n if (!existsSync(file)) return null;\n return readFileSync(file, \"utf-8\");\n}\n\n// ── Artifact Index ──\n\nexport function buildArtifactIndex(\n factoryDir: string,\n projectName: string,\n): ArtifactIndex {\n const artifacts: ArtifactEntry[] = [];\n\n // 1. Brownfield analysis\n const brownfieldPath = join(factoryDir, \".beastmode\", \"projects\", projectName, \"brownfield.md\");\n if (existsSync(brownfieldPath)) {\n const content = readFileSync(brownfieldPath, \"utf-8\");\n const firstLine = content.split(\"\\n\").find(l => l.trim() && !l.startsWith(\"#\")) || \"\";\n artifacts.push({\n type: \"brownfield\",\n path: brownfieldPath,\n summary: firstLine.slice(0, 200),\n date: statSync(brownfieldPath).mtime.toISOString(),\n });\n }\n\n // 2. Strategy sessions\n const sessions = listStrategySessions(factoryDir, projectName);\n for (const session of sessions) {\n artifacts.push({\n type: \"strategy_session\",\n path: join(getSessionsDir(factoryDir, projectName), session.sessionId),\n summary: `${session.name} (${session.methodology}) — ${session.status}`,\n date: session.createdAt,\n sessionId: session.sessionId,\n });\n }\n\n // 3. Run NLSpecs (scan project-scoped runs)\n const runsDir = join(factoryDir, \"runs\", projectName);\n if (existsSync(runsDir)) {\n const runDirs = readdirSync(runsDir).filter(d => d.startsWith(\"run-\")).sort().reverse().slice(0, 10);\n for (const runId of runDirs) {\n const nlspecPath = join(runsDir, runId, \"nlspec.md\");\n if (existsSync(nlspecPath)) {\n const content = readFileSync(nlspecPath, \"utf-8\");\n const title = content.split(\"\\n\").find(l => l.startsWith(\"# \")) || runId;\n artifacts.push({\n type: \"nlspec\",\n path: nlspecPath,\n summary: title.replace(\"# \", \"\").slice(0, 200),\n date: statSync(nlspecPath).mtime.toISOString(),\n runId,\n });\n }\n }\n }\n\n // 4. Learnings\n const learningsDir = join(getProductDir(factoryDir, projectName), \"learnings\");\n if (existsSync(learningsDir)) {\n const learningFiles = readdirSync(learningsDir).filter(f => f.endsWith(\".md\") && !f.startsWith(\".\"));\n for (const file of learningFiles) {\n const filePath = join(learningsDir, file);\n const content = readFileSync(filePath, \"utf-8\");\n const firstHeading = content.split(\"\\n\").find(l => l.startsWith(\"## \")) || file;\n artifacts.push({\n type: \"learning\",\n path: filePath,\n summary: firstHeading.replace(\"## \", \"\").slice(0, 200),\n date: statSync(filePath).mtime.toISOString(),\n });\n }\n }\n\n return {\n project: projectName,\n builtAt: new Date().toISOString(),\n artifacts,\n stats: {\n totalSessions: sessions.length,\n totalRuns: artifacts.filter(a => a.type === \"nlspec\").length,\n activeLearnings: artifacts.filter(a => a.type === \"learning\").length,\n },\n };\n}\n","/**\n * Chat handler: manages Claude conversations via Anthropic API with\n * server-side tool execution. All tools execute automatically — Claude\n * never needs user permission.\n *\n * Tools read from the local board API (http://127.0.0.1:8080) and\n * factory filesystem. No Monday.com, no external APIs, no curl.\n */\n\nimport type { ChildProcess } from \"child_process\";\nimport type { IncomingMessage } from \"http\";\nimport type { Duplex } from \"stream\";\nimport { randomUUID } from \"crypto\";\nimport { execSync } from \"child_process\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from \"fs\";\nimport { join } from \"path\";\nimport http from \"http\";\nimport { WebSocketServer, WebSocket as WsWebSocket } from \"ws\";\nimport { loadInception, saveArtifact, buildPhasePrompt, getMethodology, advancePhase, loadArtifact } from \"./inception.js\";\n\n// ── Types ──\n\ninterface ConversationMessage {\n role: \"user\" | \"assistant\";\n content: string | Array<{ type: string; [key: string]: unknown }>;\n}\n\nexport interface ChatSession {\n id: string;\n process: ChildProcess | null;\n socket: WsWebSocket | null;\n createdAt: number;\n factoryPath: string;\n claudeSessionId: string | null;\n busy: boolean;\n messageQueue: string[];\n conversationHistory: ConversationMessage[];\n backend: \"api\" | \"cli\" | null;\n sessionType: \"chat\" | \"inception\";\n sessionTypePrompt?: string;\n inception?: {\n productName: string;\n factoryDir: string;\n mode?: \"quick_brainstorm\";\n };\n}\n\nexport interface ChatManager {\n sessions: Map<string, ChatSession>;\n startSession(factoryPath: string): ChatSession;\n stopSession(sessionId: string): void;\n handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void;\n shutdown(): void;\n}\n\n// ── Token usage capture (Story 3 / S09) ──\n//\n// Ring buffer of the most recent Claude token-usage records surfaced by\n// the chat paths. Read via GET /api/token-usage/recent on the UI server\n// for debug/observability. Recording helpers are intentionally\n// best-effort — failures never propagate out of the chat loop.\n\nexport interface TokenUsageRecord {\n timestamp: string;\n model: string;\n input_tokens: number;\n output_tokens: number;\n cache_read_tokens: number;\n cache_creation_tokens: number;\n total_tokens: number;\n session_id: string;\n source: \"api\" | \"cli\";\n}\n\nconst MAX_RECENT_USAGE = 100;\nconst recentTokenUsage: TokenUsageRecord[] = [];\n\nexport function recordTokenUsage(record: TokenUsageRecord): void {\n recentTokenUsage.push(record);\n if (recentTokenUsage.length > MAX_RECENT_USAGE) {\n recentTokenUsage.shift();\n }\n}\n\nexport function getRecentTokenUsage(): TokenUsageRecord[] {\n return recentTokenUsage.slice();\n}\n\n// ── Board API helper ──\n\nfunction boardGet(path: string, boardUrl: string): Promise<string> {\n return new Promise((resolve) => {\n const url = new URL(path, boardUrl);\n const req = http.request(url, { method: \"GET\", timeout: 5000 }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => resolve(data));\n });\n req.on(\"error\", (err) => resolve(`Board API error: ${err.message}`));\n req.on(\"timeout\", () => { req.destroy(); resolve(\"Board API timeout\"); });\n req.end();\n });\n}\n\n// ── Tool definitions ──\n\ninterface ToolDef {\n name: string;\n description: string;\n input_schema: {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\nfunction getToolDefinitions(): ToolDef[] {\n return [\n {\n name: \"factory_status\",\n description: \"Get factory overview: projects, runs, daemon status, extension counts\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"factory_config\",\n description: \"Read factory configuration (pipeline, models, cost, resilience settings)\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"board_items\",\n description: \"Get all tasks from the BeastMode board with their status, priority, type, and timestamps. This is the task management board — use this for any question about tasks, status, or work items.\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"board_item_updates\",\n description: \"Get comments/updates posted on a specific board item\",\n input_schema: {\n type: \"object\",\n properties: {\n item_id: { type: \"string\", description: \"Item ID from the board\" },\n },\n required: [\"item_id\"],\n },\n },\n {\n name: \"list_runs\",\n description: \"List pipeline runs with checkpoint status and satisfaction scores\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"run_detail\",\n description: \"Get detailed run info: manifest, checkpoint, iteration satisfaction scores\",\n input_schema: {\n type: \"object\",\n properties: {\n run_id: { type: \"string\", description: \"Run ID (directory name under runs/)\" },\n },\n required: [\"run_id\"],\n },\n },\n {\n name: \"read_run_file\",\n description: \"Read a file from a run directory (nlspec.md, plan.md, scenarios/*.md, iterations/001/satisfaction.json)\",\n input_schema: {\n type: \"object\",\n properties: {\n run_id: { type: \"string\", description: \"Run ID\" },\n file_path: { type: \"string\", description: \"Relative path within the run directory\" },\n },\n required: [\"run_id\", \"file_path\"],\n },\n },\n {\n name: \"list_projects\",\n description: \"List registered projects with their path, stack, and configuration\",\n input_schema: { type: \"object\", properties: {} },\n },\n {\n name: \"read_file\",\n description: \"Read a file from the factory directory. Path is relative to factory root. Max 10KB returned.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"File path relative to factory root\" },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"list_directory\",\n description: \"List contents of a directory in the factory. Path is relative to factory root.\",\n input_schema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"Directory path relative to factory root (empty for root)\" },\n },\n required: [\"path\"],\n },\n },\n ];\n}\n\n// ── Tool execution ──\n\nfunction readJsonSafe(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction getBoardUrl(factoryPath: string): string {\n // Env var overrides all (used in Docker to point at internal board service)\n if (process.env.BEASTMODE_BOARD_URL) return process.env.BEASTMODE_BOARD_URL;\n const configPath = join(factoryPath, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.task_backend?.config?.url) return config.task_backend.config.url;\n } catch { /* ignore */ }\n }\n return \"http://127.0.0.1:8080\";\n}\n\nasync function executeTool(\n toolName: string,\n toolInput: Record<string, unknown>,\n factoryPath: string,\n): Promise<string> {\n try {\n switch (toolName) {\n case \"factory_status\": {\n const bmDir = join(factoryPath, \".beastmode\");\n const factory = readJsonSafe(join(bmDir, \"factory.json\"));\n\n const projectsDir = join(bmDir, \"projects\");\n let projects: string[] = [];\n if (existsSync(projectsDir)) {\n projects = readdirSync(projectsDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => f.replace(\".json\", \"\"));\n }\n\n const runsDir = join(factoryPath, \"runs\");\n let runs: string[] = [];\n if (existsSync(runsDir)) {\n runs = readdirSync(runsDir).filter((d) => {\n try { return statSync(join(runsDir, d)).isDirectory(); } catch { return false; }\n }).sort().reverse().slice(0, 10);\n }\n\n // Daemon detection: PID file + pgrep fallback\n let daemonStatus = \"stopped\";\n let daemonPid: number | null = null;\n const pidFile = join(bmDir, \"daemon.pid\");\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n daemonStatus = \"running\";\n } catch {\n daemonPid = null;\n }\n }\n if (!daemonPid) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\", timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n daemonStatus = \"running\";\n }\n }\n } catch { /* ignore */ }\n }\n\n // Board item counts\n let boardSummary = \"board unreachable\";\n try {\n const boardUrl = getBoardUrl(factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n const poll = JSON.parse(pollData);\n const counts: Record<string, number> = {};\n let total = 0;\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items) && items.length > 0) {\n counts[status] = items.length;\n total += items.length;\n }\n }\n boardSummary = `${total} items: ${JSON.stringify(counts)}`;\n } catch { /* ignore */ }\n\n return JSON.stringify({\n factory,\n projects,\n recent_runs: runs,\n daemon: { status: daemonStatus, pid: daemonPid },\n board: boardSummary,\n }, null, 2);\n }\n\n case \"factory_config\": {\n const configPath = join(factoryPath, \".beastmode\", \"config.json\");\n const config = readJsonSafe(configPath);\n return config ? JSON.stringify(config, null, 2) : \"No config.json found.\";\n }\n\n case \"board_items\": {\n const boardUrl = getBoardUrl(factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n try {\n const poll = JSON.parse(pollData);\n // Flatten into a readable list\n const allItems: Array<{ id: string; name: string; status: string; priority: string; type: string; updated: string }> = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items)) {\n for (const item of items) {\n const i = item as Record<string, unknown>;\n allItems.push({\n id: String(i.id || \"\"),\n name: String(i.name || \"\"),\n status: String(i.status || status),\n priority: String(i.priority || \"\"),\n type: String(i.task_type || \"\"),\n updated: String(i.updated_at || \"\"),\n });\n }\n }\n }\n if (allItems.length === 0) return \"Board is empty — no tasks.\";\n // Limit to 30 items for token efficiency\n const limited = allItems.slice(0, 30);\n const summary = limited.length < allItems.length\n ? `\\n\\n(Showing ${limited.length} of ${allItems.length} items)`\n : \"\";\n return JSON.stringify(limited, null, 2) + summary;\n } catch {\n return `Board response: ${pollData.slice(0, 500)}`;\n }\n }\n\n case \"board_item_updates\": {\n const itemId = toolInput.item_id as string;\n const boardUrl = getBoardUrl(factoryPath);\n const data = await boardGet(`/api/items/${itemId}/updates`, boardUrl);\n try {\n const updates = JSON.parse(data);\n const list = Array.isArray(updates) ? updates : [];\n if (list.length === 0) return \"No updates on this item.\";\n // Limit and summarize\n const limited = list.slice(0, 10).map((u: Record<string, unknown>) => ({\n id: u.id,\n author: u.creator_name,\n body: String(u.body || \"\").slice(0, 500),\n created: u.created_at,\n }));\n return JSON.stringify(limited, null, 2);\n } catch {\n return `Updates response: ${data.slice(0, 500)}`;\n }\n }\n\n case \"list_runs\": {\n const runsDir = join(factoryPath, \"runs\");\n if (!existsSync(runsDir)) return \"No runs directory.\";\n const runDirs = readdirSync(runsDir).sort().reverse();\n const results: Array<{ id: string; stage: string; satisfaction: number | null; iterations: number }> = [];\n for (const id of runDirs.slice(0, 15)) {\n const cp = readJsonSafe(join(runsDir, id, \"checkpoint.json\")) as Record<string, unknown> | null;\n if (cp) {\n const hist = Array.isArray(cp.satisfaction_history) ? cp.satisfaction_history : [];\n results.push({\n id,\n stage: String(cp.current_stage || \"unknown\"),\n satisfaction: hist.length > 0 ? hist[hist.length - 1] as number : null,\n iterations: (cp.iteration_count as number) || 0,\n });\n }\n }\n return results.length > 0 ? JSON.stringify(results, null, 2) : \"No runs with checkpoints.\";\n }\n\n case \"run_detail\": {\n const runId = toolInput.run_id as string;\n if (runId.includes(\"..\")) return \"Invalid run_id.\";\n const runDir = join(factoryPath, \"runs\", runId);\n if (!existsSync(runDir)) return `Run not found: ${runId}`;\n const manifest = readJsonSafe(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonSafe(join(runDir, \"checkpoint.json\"));\n const iterDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterDir)) {\n for (const d of readdirSync(iterDir).sort()) {\n const sat = readJsonSafe(join(iterDir, d, \"satisfaction.json\"));\n iterations.push({ number: parseInt(d, 10), satisfaction: sat });\n }\n }\n const files = readdirSync(runDir);\n return JSON.stringify({ id: runId, files, manifest, checkpoint, iterations }, null, 2);\n }\n\n case \"read_run_file\": {\n const runId = toolInput.run_id as string;\n const relPath = toolInput.file_path as string;\n if (runId.includes(\"..\") || relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, \"runs\", runId, relPath);\n if (!existsSync(fullPath)) return `File not found: runs/${runId}/${relPath}`;\n const content = readFileSync(fullPath, \"utf-8\");\n return content.length > 10000 ? content.slice(0, 10000) + \"\\n\\n... (truncated at 10KB)\" : content;\n }\n\n case \"list_projects\": {\n const projDir = join(factoryPath, \".beastmode\", \"projects\");\n if (!existsSync(projDir)) return \"No projects registered.\";\n const projects = readdirSync(projDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try { return JSON.parse(readFileSync(join(projDir, f), \"utf-8\")); } catch { return null; }\n })\n .filter(Boolean);\n return projects.length > 0 ? JSON.stringify(projects, null, 2) : \"No projects registered.\";\n }\n\n case \"read_file\": {\n const relPath = toolInput.path as string;\n if (relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, relPath);\n if (!fullPath.startsWith(factoryPath)) return \"Path traversal not allowed.\";\n if (!existsSync(fullPath)) return `File not found: ${relPath}`;\n try {\n const entries = readdirSync(fullPath);\n return `\"${relPath}\" is a directory with ${entries.length} entries: ${entries.slice(0, 30).join(\", \")}`;\n } catch { /* not a directory */ }\n const content = readFileSync(fullPath, \"utf-8\");\n return content.length > 10000 ? content.slice(0, 10000) + \"\\n\\n... (truncated at 10KB)\" : content;\n }\n\n case \"list_directory\": {\n const relPath = (toolInput.path as string) || \"\";\n if (relPath.includes(\"..\")) return \"Invalid path.\";\n const fullPath = join(factoryPath, relPath);\n if (!fullPath.startsWith(factoryPath)) return \"Path traversal not allowed.\";\n if (!existsSync(fullPath)) return `Directory not found: ${relPath || \"/\"}`;\n try {\n return readdirSync(fullPath).join(\"\\n\");\n } catch {\n return `Not a directory: ${relPath}`;\n }\n }\n\n default:\n return `Unknown tool: ${toolName}`;\n }\n } catch (err) {\n return `Tool error: ${(err as Error).message}`;\n }\n}\n\n// ── Chat history persistence ──\n\nfunction getChatHistoryDir(factoryPath: string): string {\n const dir = join(factoryPath, \".beastmode\", \"chat-history\");\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n return dir;\n}\n\nfunction saveConversation(\n factoryPath: string,\n sessionId: string,\n messages: ConversationMessage[],\n scope: string,\n): void {\n const dir = getChatHistoryDir(factoryPath);\n const data = {\n id: sessionId,\n scope,\n updated_at: new Date().toISOString(),\n messages,\n };\n writeFileSync(join(dir, `${sessionId}.json`), JSON.stringify(data, null, 2));\n}\n\nexport function listConversations(\n factoryPath: string,\n): Array<{ id: string; scope: string; updated_at: string; message_count: number; preview: string }> {\n const dir = getChatHistoryDir(factoryPath);\n return readdirSync(dir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try {\n const data = JSON.parse(readFileSync(join(dir, f), \"utf-8\"));\n const msgs = data.messages || [];\n const firstUser = msgs.find((m: ConversationMessage) => m.role === \"user\");\n const preview = typeof firstUser?.content === \"string\"\n ? firstUser.content.slice(0, 80)\n : \"\";\n return {\n id: data.id,\n scope: data.scope || \"factory\",\n updated_at: data.updated_at || \"\",\n message_count: msgs.length,\n preview,\n };\n } catch {\n return null;\n }\n })\n .filter((x): x is { id: string; scope: string; updated_at: string; message_count: number; preview: string } => x !== null)\n .sort((a, b) => b.updated_at.localeCompare(a.updated_at))\n .slice(0, 50);\n}\n\nexport function loadConversation(factoryPath: string, sessionId: string): ConversationMessage[] {\n if (sessionId.includes(\"..\")) return [];\n const file = join(getChatHistoryDir(factoryPath), `${sessionId}.json`);\n if (!existsSync(file)) return [];\n try {\n const data = JSON.parse(readFileSync(file, \"utf-8\"));\n return data.messages || [];\n } catch {\n return [];\n }\n}\n\n// ── System prompt ──\n\nfunction buildSystemPrompt(factoryPath: string): string {\n let factoryName = \"BeastMode Factory\";\n const factoryJson = readJsonSafe(join(factoryPath, \".beastmode\", \"factory.json\")) as {\n factory_name?: string; name?: string;\n } | null;\n if (factoryJson?.factory_name) factoryName = factoryJson.factory_name;\n else if (factoryJson?.name) factoryName = factoryJson.name;\n\n return `You are BeastMode Assistant — a concise, helpful assistant for the \"${factoryName}\" factory at ${factoryPath}.\n\n## CRITICAL RULES\n- You have tools that execute AUTOMATICALLY on the server. You NEVER need user permission. NEVER ask for permission.\n- NEVER use curl, wget, or any external HTTP calls. Your tools handle all data access.\n- NEVER reference Monday.com. This factory uses its own BeastMode Board (a local self-hosted task board).\n- All task/item data comes from the board_items tool. Use it for any question about tasks, status, or work.\n- Tool results are returned to you instantly. Just call the tool and use the result.\n- NEVER invent a name for yourself like \"BeastBot\" or any variation. You are \"BeastMode\". Address the user as a human, not a bot.\n\n## What You Can Do\n- Check task status, board items, and pipeline runs using your built-in tools\n- Read factory config, run artifacts (nlspec, plan, scenarios, satisfaction results)\n- Explore the codebase and project files\n- Explain BeastMode concepts (pipeline stages, convergence loop, satisfaction scores)\n\n## BeastMode Overview\nBeastMode is a Dark Factory pipeline that turns natural language intent into verified software.\nPipeline: Spec → Plan → Scenarios → Build-Verify Loop (convergence) → Ship → Production Verification.\nQuality is measured by satisfaction score (0.0-1.0, threshold typically 0.85).\nThe daemon polls the board for tasks and runs the pipeline automatically.\n\n## Style\n- Be concise and direct — short answers unless detail is asked for\n- Format data clearly with markdown\n- Proactively flag issues (stuck tasks, failed runs, stale state)`;\n}\n\n// ── Quick Brainstorm prompt ──\n\nfunction buildQuickBrainstormPrompt(factoryPath: string, projectName: string, index: Record<string, unknown>): string {\n const stats = index.stats as Record<string, unknown> | undefined;\n const artifacts = (index.artifacts as Array<{ type: string; summary: string; date: string }>) || [];\n return `You are BeastMode Strategy Assistant for project \"${projectName}\".\n\nYou have deep context about this project. Use it to give informed answers.\n\n## Project Context\n${JSON.stringify(stats, null, 2)}\n\n## Available Artifacts (use load_artifact tool to read details)\n${artifacts.map((a) => `- [${a.type}] ${a.summary} (${a.date})`).join(\"\\n\")}\n\n## Your Role\n- Answer questions about the project architecture, patterns, and history\n- Brainstorm features and approaches with codebase awareness\n- When the user wants to act on an idea, offer to create an epic/task on the board\n- Be concise and direct. Use your project knowledge.\n\n## Tools\nYou have load_artifact, read_file, list_directory, board_items tools available.\nUse them to give informed, specific answers.`;\n}\n\n// ── Session type system prompts ──\n\nconst SESSION_TYPE_PROMPTS: Record<string, string> = {\n feature: \"You are brainstorming a new feature. Explore requirements, UX, trade-offs. When the idea solidifies, offer to create board tasks as Drafts using the board API.\",\n architecture: \"You are evaluating a technical design decision. Consider trade-offs, alternatives, scalability. Offer to log decisions using the Decision API when conclusions are reached.\",\n refactor: \"You are planning a refactoring effort. Assess scope, risk, dependencies. Offer to break the plan into board tasks using the board API.\",\n product: \"\",\n review: \"You are reviewing recent work. Analyze runs, satisfaction scores, learnings. Surface patterns and suggest improvements. Reference specific run data from the board context.\",\n \"free-form\": \"\",\n};\n\n// ── Chat Manager ──\n\nexport function createChatManager(): ChatManager {\n const sessions = new Map<string, ChatSession>();\n const wss = new WebSocketServer({ noServer: true });\n\n function startSession(factoryPath: string): ChatSession {\n // Only one session at a time\n for (const [id] of sessions) {\n stopSession(id);\n }\n\n const session: ChatSession = {\n id: randomUUID(),\n process: null,\n socket: null,\n createdAt: Date.now(),\n factoryPath,\n claudeSessionId: null,\n busy: false,\n messageQueue: [],\n conversationHistory: [],\n backend: null,\n sessionType: \"chat\",\n };\n\n sessions.set(session.id, session);\n return session;\n }\n\n function stopSession(sessionId: string): void {\n const session = sessions.get(sessionId);\n if (!session) return;\n if (session.process) {\n try { session.process.kill(\"SIGTERM\"); } catch { /* */ }\n session.process = null;\n }\n if (session.socket) {\n try { session.socket.close(); } catch { /* */ }\n session.socket = null;\n }\n sessions.delete(sessionId);\n }\n\n function handleUpgrade(req: IncomingMessage, socket: Duplex, head: Buffer): void {\n let session: ChatSession | null = null;\n for (const s of sessions.values()) { session = s; }\n\n if (!session) {\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.end();\n return;\n }\n\n wss.handleUpgrade(req, socket, head, (ws) => {\n session!.socket = ws;\n\n ws.on(\"message\", (data: Buffer) => {\n try {\n const msg = JSON.parse(data.toString());\n if (msg.type === \"message\" && msg.content) {\n handleUserMessage(session!, msg.content, msg.scope || \"factory\");\n }\n } catch { /* ignore */ }\n });\n\n ws.on(\"close\", () => {\n // Don't destroy session on disconnect — preserve conversation history\n if (session) session.socket = null;\n });\n\n ws.on(\"error\", () => {\n if (session) session.socket = null;\n });\n });\n }\n\n function handleUserMessage(session: ChatSession, content: string, scope: string): void {\n if (session.busy) {\n session.messageQueue.push(JSON.stringify({ content, scope }));\n sendToClient(session, { type: \"system\", message: \"Message queued — processing previous request.\" });\n return;\n }\n\n if (session.sessionType === \"inception\") {\n handleInceptionMessage(session, content);\n } else {\n runMessage(session, content, scope);\n }\n }\n\n async function handleInceptionMessage(\n session: ChatSession,\n content: string,\n ): Promise<void> {\n if (!session.inception) return;\n const { productName, factoryDir } = session.inception;\n const state = loadInception(factoryDir, productName);\n if (!state) {\n sendToClient(session, { type: \"error\", message: \"Inception state not found\" });\n return;\n }\n\n // Check for approval command\n if (content.trim().toLowerCase() === \"approve\" || content.trim().toLowerCase() === \"approved\") {\n const updated = advancePhase(factoryDir, productName);\n if (updated.status === \"completed\") {\n sendToClient(session, { type: \"system\", message: \"All phases complete! Creating epic tasks on the board...\" });\n // TODO: Task 5 handles epic creation\n return;\n }\n const methodology = getMethodology(state.methodology);\n const nextPhase = methodology.phases[updated.currentPhase];\n sendToClient(session, {\n type: \"system\",\n message: `Phase \"${state.phases[state.currentPhase].name}\" approved. Moving to: ${nextPhase.name} (${nextPhase.agent_role})`,\n });\n // Clear conversation for fresh phase context\n session.conversationHistory = [];\n return;\n }\n\n // Load existing artifacts for context\n const artifacts: Record<string, string> = {};\n for (const phase of state.phases) {\n if (phase.status === \"approved\") {\n const artifactContent = loadArtifact(factoryDir, productName, phase.artifact);\n if (artifactContent) artifacts[phase.artifact] = artifactContent;\n }\n }\n\n // Build phase-specific system prompt\n const phasePrompt = buildPhasePrompt(state, artifacts);\n const methodology = getMethodology(state.methodology);\n const currentPhase = methodology.phases[state.currentPhase];\n\n const systemPrompt = `You are BeastMode's ${currentPhase.agent_role} agent, conducting Phase ${state.currentPhase + 1}: ${currentPhase.name}.\n\n${phasePrompt}\n\nIMPORTANT RULES:\n- Stay in character as a ${currentPhase.agent_role}\n- Focus on this phase only — don't jump ahead\n- When you produce the final artifact, format it as a complete markdown document\n- Start the artifact with \"# ${currentPhase.name}\" as the heading\n- The user can type \"approve\" to approve your artifact and move to the next phase`;\n\n // Route to API backend with inception system prompt\n await runViaApi(session, content, \"factory\", systemPrompt);\n }\n\n async function runMessage(session: ChatSession, content: string, scope: string = \"factory\"): Promise<void> {\n if (!session.backend) {\n if (process.env.ANTHROPIC_API_KEY) {\n session.backend = \"api\";\n } else {\n try {\n execSync(\"which claude\", { timeout: 3000, encoding: \"utf-8\" });\n session.backend = \"cli\";\n } catch {\n sendToClient(session, {\n type: \"error\",\n message: \"No Claude Code CLI found and no ANTHROPIC_API_KEY set. Run `claude login` (recommended) or set ANTHROPIC_API_KEY.\",\n });\n return;\n }\n }\n }\n\n if (session.backend === \"api\") {\n await runViaApi(session, content, scope);\n } else {\n await runViaCli(session, content, scope);\n }\n }\n\n // ═══════════════════════════════════════════════════\n // Backend 1: Anthropic API with streaming + tools\n // ═══════════════════════════════════════════════════\n\n async function runViaApi(session: ChatSession, content: string, scope: string = \"factory\", systemPromptOverride?: string): Promise<void> {\n session.busy = true;\n\n try {\n const { default: Anthropic } = await import(\"@anthropic-ai/sdk\");\n const client = new Anthropic();\n\n session.conversationHistory.push({ role: \"user\", content });\n\n let scopePrefix = \"\";\n if (scope && scope !== \"factory\") {\n scopePrefix = `\\n\\nYou are currently scoped to project \"${scope}\". Focus your answers on this project. When using tools, prioritize data relevant to this project.\\n`;\n }\n\n // Quick Brainstorm mode: build project-context system prompt\n if (!systemPromptOverride && session.inception?.mode === \"quick_brainstorm\" && session.inception.productName) {\n try {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n const index = buildArtifactIndex(session.factoryPath, session.inception.productName) as unknown as Record<string, unknown>;\n systemPromptOverride = buildQuickBrainstormPrompt(session.factoryPath, session.inception.productName, index);\n } catch {\n // Fall through to default system prompt if strategy module unavailable\n }\n }\n\n const systemPrompt = systemPromptOverride || (buildSystemPrompt(session.factoryPath) + scopePrefix);\n const tools = getToolDefinitions();\n\n // Agentic loop: Claude may call tools, get results, respond, call more tools\n let continueLoop = true;\n let loopCount = 0;\n const maxLoops = 10; // prevent infinite loops\n\n while (continueLoop && loopCount < maxLoops) {\n continueLoop = false;\n loopCount++;\n\n const stream = client.messages.stream({\n model: \"claude-sonnet-4-20250514\",\n max_tokens: 4096,\n system: systemPrompt,\n tools: tools as Parameters<typeof client.messages.stream>[0][\"tools\"],\n messages: session.conversationHistory as Parameters<typeof client.messages.stream>[0][\"messages\"],\n });\n\n const contentBlocks: Array<{ type: string; [key: string]: unknown }> = [];\n let hasToolUse = false;\n\n // Stream text to frontend in real-time\n stream.on(\"text\", (text: string) => {\n sendToClient(session, {\n type: \"content_block_delta\",\n delta: { type: \"text_delta\", text },\n });\n });\n\n const message = await stream.finalMessage();\n\n // Process content blocks\n const toolResultsMap = new Map<string, string>();\n\n for (const block of message.content) {\n if (block.type === \"text\") {\n contentBlocks.push({ type: \"text\", text: block.text });\n } else if (block.type === \"tool_use\") {\n hasToolUse = true;\n contentBlocks.push({\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n });\n\n // Show tool call to frontend\n sendToClient(session, {\n type: \"tool_use\",\n id: block.id,\n name: block.name,\n input: block.input,\n });\n\n // Execute tool automatically (async for board HTTP calls)\n const result = await executeTool(\n block.name,\n block.input as Record<string, unknown>,\n session.factoryPath,\n );\n toolResultsMap.set(block.id, result);\n\n // Show truncated result to frontend\n sendToClient(session, {\n type: \"tool_result\",\n id: block.id,\n name: block.name,\n output: result.length > 500 ? result.slice(0, 500) + \"...\" : result,\n });\n }\n }\n\n // Add assistant response to history\n session.conversationHistory.push({\n role: \"assistant\",\n content: contentBlocks,\n });\n\n // If tools were called, feed results back and continue\n if (hasToolUse) {\n const toolResults: Array<{\n type: \"tool_result\";\n tool_use_id: string;\n content: string;\n }> = [];\n\n for (const block of message.content) {\n if (block.type === \"tool_use\") {\n toolResults.push({\n type: \"tool_result\",\n tool_use_id: block.id,\n content: toolResultsMap.get(block.id) || \"\",\n });\n }\n }\n\n session.conversationHistory.push({\n role: \"user\",\n content: toolResults,\n });\n\n continueLoop = true;\n }\n\n if (message.stop_reason === \"end_turn\") {\n continueLoop = false;\n }\n }\n\n // Signal completion (silent — frontend just stops thinking indicator)\n sendToClient(session, { type: \"result\", subtype: \"success\" });\n } catch (err) {\n const errMsg = (err as Error).message || \"Unknown error\";\n sendToClient(session, {\n type: \"error\",\n message: `API error: ${errMsg}`,\n });\n } finally {\n // Persist conversation to disk\n try { saveConversation(session.factoryPath, session.id, session.conversationHistory, scope); } catch { /* ignore */ }\n\n session.busy = false;\n const next = session.messageQueue.shift();\n if (next) {\n try {\n const parsed = JSON.parse(next);\n runMessage(session, parsed.content, parsed.scope || \"factory\");\n } catch {\n runMessage(session, next, \"factory\");\n }\n }\n }\n }\n\n // ═══════════════════════════════════════════════════\n // Backend 2: Claude Code CLI (fallback)\n // ═══════════════════════════════════════════════════\n\n async function runViaCli(session: ChatSession, content: string, scope: string = \"factory\"): Promise<void> {\n session.busy = true;\n\n try {\n const { spawn } = await import(\"child_process\");\n\n // Pre-fetch board data so Claude doesn't need to use curl\n let boardContext = \"\";\n try {\n const boardUrl = getBoardUrl(session.factoryPath);\n const pollData = await boardGet(\"/api/poll\", boardUrl);\n const poll = JSON.parse(pollData);\n const summary: string[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items) && items.length > 0) {\n for (const item of items) {\n const i = item as Record<string, unknown>;\n summary.push(`#${i.id} \"${i.name}\" [${i.status}] priority=${i.priority || \"none\"} type=${i.task_type || \"auto\"}`);\n }\n }\n }\n if (summary.length > 0) {\n boardContext = `\\n\\nCurrent board items (${summary.length} total):\\n${summary.join(\"\\n\")}`;\n } else {\n boardContext = \"\\n\\nBoard is empty — no tasks.\";\n }\n } catch {\n boardContext = \"\\n\\nBoard unavailable.\";\n }\n\n const scopeContext = scope !== \"factory\"\n ? `\\nYou are scoped to project \"${scope}\". Focus answers on this project only.`\n : \"\\nYou have factory-wide scope. Answer questions about any/all projects.\";\n\n // Build the prompt with full context + conversation history.\n // We always include the system preamble and history rather than\n // relying on --resume, which breaks in Docker (session storage\n // not persisting between CLI invocations).\n let historyBlock = \"\";\n if (session.conversationHistory.length > 0) {\n // Include last N turns to stay within context limits\n const recentHistory = session.conversationHistory.slice(-20);\n const formatted = recentHistory.map(h =>\n h.role === \"user\" ? `User: ${h.content}` : `Assistant: ${h.content}`\n ).join(\"\\n\\n\");\n historyBlock = `\\n\\nCONVERSATION HISTORY (continue this conversation naturally):\\n${formatted}\\n\\n---\\n`;\n }\n\n // Resolve board URL for API instructions\n const boardApiUrl = getBoardUrl(session.factoryPath);\n const boardParam = scope !== \"factory\" ? `?board=${scope}` : \"\";\n\n const prompt = `CRITICAL CONTEXT — YOU MUST READ THIS:\nYou are the BeastMode chat assistant running inside a BeastMode factory.\n\nIMPORTANT RULES:\n- Monday.com does NOT exist in this system. NEVER mention Monday.com. There is NO Monday.com integration.\n- This factory uses a LOCAL self-hosted BeastMode Board with a REST API.\n- You have tools available. You can execute bash commands. Use curl to interact with the board API.\n- NEVER ask for permissions. You have full access. Just do it.\n${scopeContext}\n${session.sessionTypePrompt ? \"\\nSESSION ROLE:\\n\" + session.sessionTypePrompt + \"\\n\" : \"\"}\nBOARD API (use curl to manage tasks):\n- Base URL: ${boardApiUrl}\n- List items: curl -s '${boardApiUrl}/api/items${boardParam}'\n- Create item: curl -s -X POST '${boardApiUrl}/api/items${boardParam}' -H 'Content-Type: application/json' -d '{\"name\":\"Task title\",\"status\":\"\",\"priority\":\"Medium\",\"task_type\":\"deep-planning\"}'\n (status=\"\" means Draft/New. Valid statuses: \"\", \"New\", \"Ready\", \"Working on it\", \"Done\", etc.)\n- Update item: curl -s -X PATCH '${boardApiUrl}/api/items/ITEM_ID${boardParam}' -H 'Content-Type: application/json' -d '{\"status\":\"Ready\"}'\n\nDECISION API (use curl to log strategic decisions):\n- List: curl -s '${boardApiUrl}/api/strategy/${scope}/decisions'\n- Create: curl -s -X POST '${boardApiUrl}/api/strategy/${scope}/decisions' -H 'Content-Type: application/json' -d '{\"title\":\"Decision title\",\"context\":\"Why this was decided\"}'\n- Update: curl -s -X PATCH '${boardApiUrl}/api/strategy/${scope}/decisions/ID' -H 'Content-Type: application/json' -d '{\"status\":\"superseded\",\"outcome\":\"What happened\"}'\n\nCurrent board items:\n${boardContext}\n\nFactory path: ${session.factoryPath}\n${historyBlock}\nUSER MESSAGE: ${content}\n\nRespond concisely. Continue the conversation naturally.`;\n\n // Use --allowedTools to whitelist safe tools for board interaction.\n // In Docker (root), wrap with runuser to avoid the root-user block\n // on --dangerously-skip-permissions.\n const isRoot = process.getuid?.() === 0;\n const claudeArgs: string[] = [\n \"-p\", prompt,\n \"--output-format\", \"stream-json\",\n \"--verbose\",\n \"--dangerously-skip-permissions\",\n ];\n\n // When running as root (Docker), use runuser to drop to 'node' user\n // so Claude Code CLI allows --dangerously-skip-permissions and has\n // a proper writable home directory for session storage.\n let spawnCmd: string;\n let spawnArgs: string[];\n if (isRoot) {\n spawnCmd = \"runuser\";\n spawnArgs = [\"-u\", \"node\", \"--\", \"claude\", ...claudeArgs];\n } else {\n spawnCmd = \"claude\";\n spawnArgs = claudeArgs;\n }\n\n const child = spawn(spawnCmd, spawnArgs, {\n cwd: session.factoryPath,\n env: {\n ...process.env,\n BEASTMODE_FACTORY_PATH: session.factoryPath,\n ...(isRoot ? { HOME: \"/home/node\" } : {}),\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n session.process = child;\n\n // Track conversation for persistence\n session.conversationHistory.push({ role: \"user\", content });\n let collectedText = \"\";\n\n let stdoutBuffer = \"\";\n child.stdout?.on(\"data\", (data: Buffer) => {\n stdoutBuffer += data.toString(\"utf-8\");\n const lines = stdoutBuffer.split(\"\\n\");\n stdoutBuffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line);\n if (parsed.type === \"system\" && parsed.subtype === \"init\" && parsed.session_id) {\n session.claudeSessionId = parsed.session_id;\n continue;\n }\n if (parsed.type === \"rate_limit_event\") continue;\n\n // Collect assistant text for history\n if (parsed.type === \"assistant\" && parsed.message?.content) {\n for (const block of parsed.message.content as Array<{ type: string; text?: string }>) {\n if (block.type === \"text\" && block.text) collectedText += block.text;\n }\n } else if (parsed.type === \"content_block_delta\" && parsed.delta?.text) {\n collectedText += parsed.delta.text as string;\n }\n\n const transformed = transformCliEvent(parsed);\n if (transformed) sendToClient(session, transformed);\n } catch {\n // Non-JSON lines from Claude CLI (progress, box-drawing,\n // debug output). Never forward these — they render as\n // mysterious gray shapes in the chat UI.\n }\n }\n });\n\n child.stderr?.on(\"data\", (data: Buffer) => {\n const text = data.toString(\"utf-8\").trim();\n if (!text) return;\n // Filter non-fatal Claude CLI startup noise (config migrations,\n // backup messages, version checks). These are cosmetic — Claude\n // still works. Only surface genuine errors to the user.\n if (\n text.includes(\"configuration file not found\") ||\n text.includes(\"backup file exists\") ||\n text.includes(\"manually restore it by running\") ||\n text.includes(\"CLAUDE_CODE_\")\n ) return;\n sendToClient(session, { type: \"error\", message: text });\n });\n\n child.on(\"exit\", () => {\n session.process = null;\n session.busy = false;\n\n // Save assistant response and persist conversation\n if (collectedText) {\n session.conversationHistory.push({ role: \"assistant\", content: collectedText });\n }\n try { saveConversation(session.factoryPath, session.id, session.conversationHistory, scope); } catch { /* ignore */ }\n\n sendToClient(session, { type: \"result\", subtype: \"success\" });\n const next = session.messageQueue.shift();\n if (next) {\n try {\n const parsed = JSON.parse(next);\n runMessage(session, parsed.content, parsed.scope || \"factory\");\n } catch {\n runMessage(session, next, \"factory\");\n }\n }\n });\n\n child.on(\"error\", (err) => {\n sendToClient(session, { type: \"error\", message: `Process error: ${err.message}` });\n session.process = null;\n session.busy = false;\n });\n } catch (err) {\n sendToClient(session, {\n type: \"error\",\n message: `Failed to spawn Claude: ${(err as Error).message}`,\n });\n session.busy = false;\n }\n }\n\n function transformCliEvent(parsed: Record<string, unknown>): Record<string, unknown> | null {\n const type = parsed.type as string;\n switch (type) {\n case \"assistant\": {\n const msg = parsed.message as { content?: unknown[] } | undefined;\n if (msg?.content) return { type: \"assistant\", content: msg.content };\n if (parsed.content) return { type: \"assistant\", content: parsed.content };\n return null;\n }\n case \"content_block_delta\":\n case \"content_block_start\":\n case \"content_block_stop\":\n case \"message_start\":\n case \"message_delta\":\n case \"result\":\n return parsed;\n default:\n return parsed;\n }\n }\n\n function sendToClient(session: ChatSession, data: Record<string, unknown>): void {\n if (session.socket && session.socket.readyState === WsWebSocket.OPEN) {\n session.socket.send(JSON.stringify(data));\n }\n }\n\n function shutdown(): void {\n for (const [id] of sessions) { stopSession(id); }\n wss.close();\n }\n\n return { sessions, startSession, stopSession, handleUpgrade, shutdown };\n}\n","import { readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync, mkdirSync, statSync, rmSync } from \"fs\";\nimport { join, basename, resolve, dirname } from \"path\";\nimport { homedir } from \"os\";\nimport { archiveOldRuns, pinRun, unpinRun, isRunPinned } from \"./archival.js\";\nimport { randomUUID } from \"crypto\";\nimport { execSync, spawnSync } from \"child_process\";\nimport http from \"http\";\nimport { listConversations, loadConversation } from \"./chat-handler.js\";\nimport {\n collectStatus,\n installPlugin,\n removePlugin,\n fetchRegistryIndex,\n addMcp,\n removeMcp,\n listMcps,\n listSkills,\n createSkill,\n removeSkill,\n addHook,\n removeHook,\n listHooks,\n configReset,\n generateDefaults,\n detectStack,\n} from \"../../engine/index.js\";\nimport type { StatusInput, HookEvent } from \"../../engine/index.js\";\n\nexport interface BoardRoute {\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n pattern: string;\n handler: (\n body: unknown,\n params: Record<string, string>,\n query?: Record<string, string>,\n ) => Promise<unknown> | unknown;\n}\n\n/**\n * Sentinel response type used by handlers that need to return raw\n * binary bytes (e.g., attachment downloads) instead of JSON. The\n * request dispatcher in `server.ts` checks `instanceof BinaryResponse`\n * and writes the bytes directly with the correct Content-Type and\n * Content-Length headers.\n *\n * Added 2026-04-15 for Gap 8a (attachments display). The existing\n * proxyToBoard helper is JSON-only because it does `JSON.parse(data)`\n * on every response, which corrupts image bytes. Binary routes use\n * `proxyBinaryToBoard` (below) to fetch the raw body and wrap it in\n * this class.\n */\nexport class BinaryResponse {\n constructor(\n public body: Buffer,\n public contentType: string,\n public filename?: string,\n ) {}\n}\n\n/** Validate that a name parameter is a simple identifier (no path traversal). */\nfunction assertSafeName(name: string): void {\n if (!name || /[/\\\\]/.test(name) || name === \".\" || name === \"..\") {\n throw new Error(`Invalid name: ${name}`);\n }\n}\n\n// ── Board proxy to existing board API ──\n\n/**\n * Thrown by proxyToBoard when the upstream board returns a 4xx or 5xx.\n * server.ts catches this and relays the status code verbatim so clients\n * (browser and verifier curl calls) see the board's real HTTP status\n * instead of a mis-classified 200 or 500.\n */\nexport class HttpError extends Error {\n constructor(\n public readonly statusCode: number,\n public readonly body: unknown,\n ) {\n super(`Board returned HTTP ${statusCode}`);\n this.name = \"HttpError\";\n }\n}\n\nexport function getBoardUrl(factoryDir: string): string {\n // Env var overrides all (used in Docker to point at internal board service)\n if (process.env.BEASTMODE_BOARD_URL) return process.env.BEASTMODE_BOARD_URL;\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.task_backend?.config?.url) {\n return config.task_backend.config.url;\n }\n } catch { /* ignore */ }\n }\n return \"http://127.0.0.1:8080\";\n}\n\nfunction proxyToBoard(\n boardUrl: string,\n method: string,\n path: string,\n body?: unknown,\n query?: Record<string, string>,\n): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const postData = body ? JSON.stringify(body) : undefined;\n const req = http.request(url, {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(postData ? { \"Content-Length\": Buffer.byteLength(postData).toString() } : {}),\n },\n }, (res) => {\n const statusCode = res.statusCode ?? 200;\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => {\n let parsed: unknown;\n try { parsed = JSON.parse(data); } catch { parsed = { raw: data }; }\n if (statusCode >= 400) {\n reject(new HttpError(statusCode, parsed));\n } else {\n resolve(parsed);\n }\n });\n });\n req.on(\"error\", (err) => reject(new Error(`Board proxy error: ${err.message}`)));\n if (postData) req.write(postData);\n req.end();\n });\n}\n\n/**\n * Binary-safe counterpart to proxyToBoard. Collects the response body\n * as Buffer chunks (not decoded to string) and returns a BinaryResponse\n * with the original Content-Type header preserved. Used for attachment\n * downloads (Gap 8a). Added 2026-04-15.\n */\nfunction proxyBinaryToBoard(\n boardUrl: string,\n path: string,\n query?: Record<string, string>,\n): Promise<BinaryResponse> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const req = http.request(\n url,\n { method: \"GET\" },\n (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(\n new Error(\n `Board proxy error: HTTP ${res.statusCode} for ${path}`,\n ),\n );\n return;\n }\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n const body = Buffer.concat(chunks);\n const contentType = res.headers[\"content-type\"] || \"application/octet-stream\";\n // Content-Disposition gives us the original filename when\n // the backend sends FileResponse(..., filename=...)\n const cd = res.headers[\"content-disposition\"] || \"\";\n const match = /filename=\"([^\"]+)\"/.exec(cd);\n const filename = match ? match[1] : undefined;\n resolve(new BinaryResponse(body, contentType, filename));\n });\n },\n );\n req.on(\"error\", (err) =>\n reject(new Error(`Board proxy error: ${err.message}`)),\n );\n req.end();\n });\n}\n\n/**\n * Gap 8 transparent fallback proxy. Used by `server.ts` when a `/api/*`\n * request didn't match any explicit `boardRoutes` pattern or any local\n * handler (init/chat). Forwards the request unchanged to the board and\n * returns its raw response (status code + content-type + body bytes) so\n * the UI dispatcher can relay it verbatim to the client.\n *\n * This makes new board routes reachable from the UI automatically\n * instead of requiring a manual allowlist entry in `getBoardRoutes()`\n * — the \"invisible contract\" failure mode that broke Story 1's\n * `/api/pipeline-config` endpoint. Added 2026-04-16.\n */\nexport function transparentProxyToBoard(\n boardUrl: string,\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n path: string,\n body?: unknown,\n query?: Record<string, string>,\n): Promise<{ statusCode: number; contentType: string; body: Buffer }> {\n return new Promise((resolve, reject) => {\n const url = new URL(path, boardUrl);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined && v !== null && v !== \"\") {\n url.searchParams.set(k, v);\n }\n }\n }\n const postData = body !== undefined ? JSON.stringify(body) : undefined;\n const req = http.request(\n url,\n {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(postData\n ? { \"Content-Length\": Buffer.byteLength(postData).toString() }\n : {}),\n },\n },\n (res) => {\n const chunks: Buffer[] = [];\n res.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n res.on(\"end\", () => {\n resolve({\n statusCode: res.statusCode || 502,\n contentType:\n (res.headers[\"content-type\"] as string) || \"application/json\",\n body: Buffer.concat(chunks),\n });\n });\n },\n );\n req.on(\"error\", (err) =>\n reject(new Error(`Board proxy error: ${err.message}`)),\n );\n if (postData) req.write(postData);\n req.end();\n });\n}\n\n// Build the query dict we forward to the board server. We only care\n// about `board` here — passing anything else risks leaking the UI's\n// internal query params into the backend.\nfunction scopedQuery(query?: Record<string, string>): Record<string, string> | undefined {\n if (!query) return undefined;\n const b = query.board;\n if (!b || b === \"all\") return undefined;\n return { board: b };\n}\n\n// ── Helpers (file I/O) ──\n\nfunction readJsonFile(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction deepMerge(target: Record<string, unknown>, source: Record<string, unknown>): Record<string, unknown> {\n const result = { ...target };\n for (const key of Object.keys(source)) {\n if (\n source[key] !== null &&\n typeof source[key] === \"object\" &&\n !Array.isArray(source[key]) &&\n target[key] !== null &&\n typeof target[key] === \"object\" &&\n !Array.isArray(target[key])\n ) {\n result[key] = deepMerge(\n target[key] as Record<string, unknown>,\n source[key] as Record<string, unknown>\n );\n } else {\n result[key] = source[key];\n }\n }\n return result;\n}\n\nfunction getRunsDir(factoryDir: string): string {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (config.runs_path) return config.runs_path;\n } catch { /* ignore */ }\n }\n return join(factoryDir, \"runs\");\n}\n\n// ── Threshold safety check (feature #7) ────────────────────────────\n\nexport interface StrandedRun {\n run_id: string;\n item_id: string | null;\n best_satisfaction: number;\n project_id: string | null;\n current_stage: string;\n}\n\nconst _TERMINAL_STAGES = new Set<string>([\n \"done\",\n \"shipped\",\n \"stuck\",\n \"stuck_oscillating\",\n \"stuck_infra_gap\",\n \"ready_for_review\",\n]);\n\n/**\n * Scan runs_dir for active runs whose best_satisfaction is below the\n * proposed new threshold. Supports both flat layout (runs/run-*) and\n * per-project layout (runs/<project>/run-*). Returns an empty list\n * when runs_dir doesn't exist.\n */\nexport function scanStrandedRuns(\n runsDir: string,\n newThreshold: number,\n): StrandedRun[] {\n if (!existsSync(runsDir)) return [];\n\n const stranded: StrandedRun[] = [];\n\n const walkRun = (runPath: string, projectId: string | null): void => {\n const ckptPath = join(runPath, \"checkpoint.json\");\n if (!existsSync(ckptPath)) return;\n let ckpt: Record<string, unknown>;\n try {\n ckpt = JSON.parse(readFileSync(ckptPath, \"utf-8\"));\n } catch {\n return;\n }\n const stage = String(ckpt.current_stage || \"\");\n if (_TERMINAL_STAGES.has(stage)) return;\n\n const bestSat = ckpt.best_satisfaction;\n if (typeof bestSat !== \"number\") return;\n if (bestSat >= newThreshold) return;\n\n stranded.push({\n run_id: String(ckpt.run_id || \"\"),\n item_id:\n typeof ckpt.item_id === \"string\" || typeof ckpt.item_id === \"number\"\n ? String(ckpt.item_id)\n : null,\n best_satisfaction: bestSat,\n project_id: projectId,\n current_stage: stage,\n });\n };\n\n try {\n const entries = readdirSync(runsDir);\n for (const entry of entries) {\n const entryPath = join(runsDir, entry);\n let stat;\n try {\n stat = statSync(entryPath);\n } catch {\n continue;\n }\n if (!stat.isDirectory()) continue;\n\n if (entry.startsWith(\"run-\")) {\n // Flat layout\n walkRun(entryPath, null);\n } else if (!entry.startsWith(\".\")) {\n // Per-project subdir\n let subEntries: string[];\n try {\n subEntries = readdirSync(entryPath);\n } catch {\n continue;\n }\n for (const sub of subEntries) {\n if (!sub.startsWith(\"run-\")) continue;\n const subPath = join(entryPath, sub);\n try {\n if (statSync(subPath).isDirectory()) {\n walkRun(subPath, entry);\n }\n } catch {\n continue;\n }\n }\n }\n }\n } catch {\n return stranded;\n }\n\n return stranded;\n}\n\n// ── Route factory ──\n\nexport function getBoardRoutes(factoryDir: string): BoardRoute[] {\n return [\n // ── Status ──\n {\n method: \"GET\",\n pattern: \"/api/status\",\n handler: async () => {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n throw new Error(\"Not a valid factory: factory.json not found\");\n }\n const factoryIdentity = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n\n // Count projects (subdirectory format + flat format)\n const projectsDir = join(bmDir, \"projects\");\n let projectCount = 0;\n if (existsSync(projectsDir)) {\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n // Subdirectory: projects/{name}/project.json\n if (existsSync(join(projectsDir, entry, \"project.json\"))) { projectCount++; continue; }\n // Flat: projects/{name}.json (legacy)\n if (entry.endsWith(\".json\")) projectCount++;\n }\n }\n\n // Plugin names from lock\n const lockPath = join(bmDir, \"extensions.lock\");\n let pluginNames: string[] = [];\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n pluginNames = Object.keys(lock.plugins || {});\n } catch { /* empty */ }\n }\n\n // MCP servers\n let mcpServers: Record<string, unknown> = {};\n try {\n mcpServers = listMcps(factoryDir);\n } catch { /* empty */ }\n\n // Hooks\n let hooks: Record<string, unknown[]> = {};\n try {\n hooks = listHooks(factoryDir);\n } catch { /* empty */ }\n\n // Skills\n let skillCount = 0;\n try {\n skillCount = listSkills(factoryDir).length;\n } catch { /* empty */ }\n\n // Runs\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => {\n if (d.startsWith(\".\")) return false;\n try {\n return readdirSync(join(runsDir, d)).length > 0;\n } catch {\n return false;\n }\n })\n .sort();\n }\n\n // Daemon PID — check PID file first, then fall back to process detection\n const pidFile = join(factoryDir, \".beastmode\", \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch {\n pidAlive = false;\n }\n }\n // Fallback: detect daemon running via systemd or direct process\n if (!pidAlive) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\",\n timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n pidAlive = true;\n }\n }\n } catch {\n // pgrep not available or timed out — leave as stopped\n }\n }\n\n // Ask the board for the last daemon heartbeat. This works across\n // process/container/host boundaries where the PID check above\n // cannot see the daemon (e.g. Docker Compose, remote daemon).\n let daemonHeartbeatAgeSec: number | null = null;\n try {\n const hb = await proxyToBoard(\n getBoardUrl(factoryDir),\n \"GET\",\n \"/api/daemon/heartbeat\",\n ) as { seconds_ago: number | null };\n if (hb && typeof hb.seconds_ago === \"number\") {\n daemonHeartbeatAgeSec = hb.seconds_ago;\n }\n } catch {\n // Board unreachable — fall back to local PID check only.\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n daemonHeartbeatAgeSec,\n };\n\n return collectStatus(input);\n },\n },\n\n // ── Factory Status ──\n {\n method: \"GET\",\n pattern: \"/api/factory/status\",\n handler: async () => {\n // Determine daemon age: prefer the local .heartbeat file (bare-metal\n // and single-container deployments), fall back to the board's\n // in-memory heartbeat (works across containers where the UI can't\n // see the daemon's log directory, e.g. Docker Compose).\n const boardUrl = getBoardUrl(factoryDir);\n let ageSecs: number | null = null;\n\n const heartbeatPath = join(factoryDir, \"daemon\", \"logs\", \".heartbeat\");\n if (existsSync(heartbeatPath)) {\n try {\n const ts = parseInt(readFileSync(heartbeatPath, \"utf-8\").trim(), 10);\n if (!isNaN(ts)) {\n ageSecs = Math.floor(Date.now() / 1000) - ts;\n }\n } catch { /* ignore */ }\n }\n\n if (ageSecs === null) {\n try {\n const hb = await proxyToBoard(\n boardUrl,\n \"GET\",\n \"/api/daemon/heartbeat\",\n ) as { seconds_ago: number | null };\n if (hb && typeof hb.seconds_ago === \"number\") {\n ageSecs = hb.seconds_ago;\n }\n } catch { /* board unreachable — leave as unknown */ }\n }\n\n let daemonStatus: \"running\" | \"slow\" | \"stopped\" = \"stopped\";\n let lastSeen: string = \"unknown\";\n if (ageSecs !== null && ageSecs >= 0) {\n if (ageSecs < 120) {\n daemonStatus = \"running\";\n } else if (ageSecs < 300) {\n daemonStatus = \"slow\";\n } else {\n daemonStatus = \"stopped\";\n }\n if (ageSecs < 60) {\n lastSeen = `${ageSecs}s ago`;\n } else if (ageSecs < 3600) {\n lastSeen = `${Math.floor(ageSecs / 60)}m ago`;\n } else {\n lastSeen = `${Math.floor(ageSecs / 3600)}h ago`;\n }\n }\n\n // Read slots — Gap 31 fix. Two data sources:\n //\n // (1) totalSlots comes from the daemon's runtime config file\n // (config/beastmode.daemon.json or config/beastmode.docker.json\n // — the docker variant is what the Docker Compose daemon reads\n // via BEASTMODE_CONFIG). The old code read the FACTORY\n // config file under .beastmode/ (schema with `pipeline.*`,\n // `runtime.*` keys, NO `max_slots`) — so the UI always fell\n // through to a hardcoded default of 2 even when the daemon\n // was running 3 slots. The fix reads the DAEMON config,\n // which does define `max_slots`.\n //\n // (2) busySlots prefers the daemon-written .slots.json file when\n // present (written after every poll cycle with real occupancy).\n // Falls back to counting items with status=\"Working on it\"\n // via /api/poll's `working_on_it` list — but that's an item\n // status filter, NOT daemon slot occupancy. Items in review/\n // verify-prod/merge/heal phases occupy slots too but don't\n // have status=\"Working on it\", so the fallback undercounts.\n // The .slots.json path is the accurate source once the daemon\n // writes it (implementation ships alongside this UI change).\n let busySlots = 0;\n let totalSlots = 3; // default — matches DaemonConfig.max_slots default\n let shortPhaseReserve: number | undefined;\n let slotsTimestamp: number | undefined;\n\n // Preferred: read the daemon's own slots report if available.\n const slotsPath = join(factoryDir, \"daemon\", \"logs\", \".slots.json\");\n let usedDaemonSlotsFile = false;\n if (existsSync(slotsPath)) {\n try {\n const slots = JSON.parse(readFileSync(slotsPath, \"utf-8\"));\n if (typeof slots.busy === \"number\" && typeof slots.total === \"number\") {\n busySlots = slots.busy;\n totalSlots = slots.total;\n usedDaemonSlotsFile = true;\n }\n if (typeof slots.short_phase_reserve === \"number\") {\n shortPhaseReserve = slots.short_phase_reserve;\n }\n if (typeof slots.timestamp === \"number\") {\n slotsTimestamp = slots.timestamp;\n }\n } catch { /* ignore — fall back to heuristics below */ }\n }\n\n if (!usedDaemonSlotsFile) {\n // Fallback: approximate busy count from working_on_it items.\n // Underestimates (won't count items in review/verify-prod/etc).\n try {\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll\") as Record<string, unknown>;\n const workingItems = poll[\"working_on_it\"];\n if (Array.isArray(workingItems)) {\n busySlots = workingItems.length;\n }\n } catch { /* board may not be running */ }\n\n // Fallback totalSlots: read max_slots from the daemon's runtime\n // config file. Try .docker.json first (Docker Compose setups),\n // then .daemon.json (bare-metal), then give up with the default.\n for (const name of [\"beastmode.docker.json\", \"beastmode.daemon.json\"]) {\n const configPath = join(factoryDir, \"config\", name);\n if (!existsSync(configPath)) continue;\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (typeof config.max_slots === \"number\") {\n totalSlots = config.max_slots;\n }\n // short_phase_reserve may appear in config before daemon writes .slots.json\n if (shortPhaseReserve === undefined && typeof config.short_phase_reserve === \"number\") {\n shortPhaseReserve = config.short_phase_reserve;\n }\n if (typeof config.max_slots === \"number\") {\n break;\n }\n } catch { /* keep trying other paths */ }\n }\n }\n\n // Default short_phase_reserve to 1 (matches DaemonConfig default) when\n // neither .slots.json nor the config file provides the value.\n if (shortPhaseReserve === undefined) {\n shortPhaseReserve = Math.max(0, Math.min(1, totalSlots - 1));\n }\n\n // Read alerts\n const alertsPath = join(factoryDir, \"daemon\", \"logs\", \".alerts.json\");\n let alerts: unknown[] = [];\n if (existsSync(alertsPath)) {\n try {\n const parsed = JSON.parse(readFileSync(alertsPath, \"utf-8\"));\n if (Array.isArray(parsed)) alerts = parsed;\n } catch { /* ignore */ }\n }\n\n return {\n daemon: daemonStatus,\n lastSeen,\n slots: {\n total: totalSlots,\n busy: Math.min(busySlots, totalSlots),\n free: Math.max(totalSlots - busySlots, 0),\n short_phase_reserve: shortPhaseReserve,\n ...(slotsTimestamp !== undefined ? { timestamp: slotsTimestamp } : {}),\n },\n alerts,\n };\n },\n },\n\n // ── Pipeline configuration (Story 1 / pipeline-board-view epic) ──\n // Direct passthrough — the scenarios specifically test\n // http://ui:8080/api/pipeline-config (no /api/board/ prefix) because\n // that matches the backend route path verbatim. Exposing at a different\n // path would break those scenarios. See\n // docs/zero-to-productive-readiness.md Gap 8 for the systemic version\n // of this bug: the UI proxy allowlist is an invisible contract the\n // planner ignores, so new backend routes need matching UI proxy\n // entries. This is one of those entries, added post-hoc to unstick\n // board item 9 (Story 1).\n {\n method: \"GET\",\n pattern: \"/api/pipeline-config\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", \"/api/pipeline-config\", undefined, scopedQuery(query));\n },\n },\n\n // ── Telemetry status (Gap 15: opt-in anonymous telemetry) ──\n // Direct passthrough proxy — matches the backend route path verbatim\n // so the Settings UI can fetch /api/telemetry/status through the UI\n // server at http://ui:8080. Same pattern as /api/pipeline-config.\n {\n method: \"GET\",\n pattern: \"/api/telemetry/status\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", \"/api/telemetry/status\", undefined, scopedQuery(query));\n },\n },\n\n // ── Environment config (Story 1 / multi-env lifecycle epic — Gap 17) ──\n // Direct passthrough proxies so browser_any scenarios can verify\n // the resolver at http://ui:8080/api/environments and\n // /api/debug/env-config. Skipping these entries is the exact\n // failure mode documented in Gap 8 (\"UI proxy allowlist is an\n // invisible contract the planner ignores\") — do NOT remove.\n //\n // These endpoints use the `project` query param (not `board`) to\n // select which project's env config to return. scopedQuery() only\n // forwards the `board` param, so we extract `project` explicitly.\n {\n method: \"GET\",\n pattern: \"/api/environments\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const fwd = query?.project ? { project: query.project } : undefined;\n return proxyToBoard(boardUrl, \"GET\", \"/api/environments\", undefined, fwd);\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/debug/env-config\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const fwd = query?.project ? { project: query.project } : undefined;\n return proxyToBoard(boardUrl, \"GET\", \"/api/debug/env-config\", undefined, fwd);\n },\n },\n\n // ── Board Items (proxy to existing board at :8080) ──\n // Every proxy forwards the `board` query param so the Python server\n // can route to the correct per-project SQLite database. `\"all\"` is\n // treated as the default (aggregate) board.\n {\n method: \"GET\",\n pattern: \"/api/board/items\",\n handler: async (_body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n const bq = scopedQuery(query);\n\n if (!bq) {\n // \"All Projects\" mode — server-side aggregation via /api/poll-all.\n // The board server owns the SQLite layer and filters ephemeral\n // verify/test boards plus the default (legacy) database. Items\n // arrive pre-tagged with `project_id`.\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll-all\") as Record<string, unknown>;\n const seen = new Set<string>();\n const allItems: unknown[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (!Array.isArray(items)) continue;\n for (const item of items) {\n const rec = item as Record<string, unknown>;\n const key = String(rec.project_id ?? \"\") + \":\" + String(rec.id ?? \"\");\n if (seen.has(key)) continue;\n seen.add(key);\n allItems.push({ ...rec, status_bucket: status });\n }\n }\n return { items: allItems };\n }\n\n const poll = await proxyToBoard(boardUrl, \"GET\", \"/api/poll\", undefined, bq) as Record<string, unknown>;\n // Flatten all status buckets into a single items array.\n // Deduplicate by item ID — critical items appear in both their\n // status bucket and the \"critical\" bucket.\n const seen = new Set<string>();\n const allItems: unknown[] = [];\n for (const [status, items] of Object.entries(poll)) {\n if (Array.isArray(items)) {\n for (const item of items) {\n const id = String((item as Record<string, unknown>).id ?? \"\");\n if (id && seen.has(id)) continue;\n if (id) seen.add(id);\n allItems.push({ ...item as Record<string, unknown>, status_bucket: status });\n }\n }\n }\n return { items: allItems };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/items\",\n handler: async (body, _params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", \"/api/items\", body, scopedQuery(query));\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/board/items/:id\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"PATCH\", `/api/items/${params.id}`, body, scopedQuery(query));\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/board/items/:id\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"DELETE\", `/api/items/${params.id}`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/board/items/:id/updates\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", `/api/items/${params.id}/updates`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/items/:id/updates\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", `/api/items/${params.id}/updates`, body, scopedQuery(query));\n },\n },\n\n // ── Attachments (Gap 8a — 2026-04-15) ──\n // The board service stores per-item attachments (screenshots from\n // verify_production.py, uploaded files from the \"new task\"\n // dialog, etc.) at /app/data/attachments/<project>/<item>/<id>_<name>.\n // Before this proxy existed, the UI had no way to list or fetch\n // them, which meant Story 4's Done Evidence message said \"2\n // screenshots attached\" but the UI showed nothing. See\n // docs/zero-to-productive-readiness.md Gap 8a.\n {\n method: \"GET\",\n pattern: \"/api/board/items/:id/attachments\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(\n boardUrl,\n \"GET\",\n `/api/items/${params.id}/attachments`,\n undefined,\n scopedQuery(query),\n );\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/board/attachments/:id/download\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n // Binary response — returns BinaryResponse which the\n // dispatcher in server.ts writes directly without JSON\n // serialization.\n return proxyBinaryToBoard(\n boardUrl,\n `/api/attachments/${params.id}/download`,\n scopedQuery(query),\n );\n },\n },\n\n // ── Replies ──\n {\n method: \"GET\",\n pattern: \"/api/board/updates/:id/replies\",\n handler: async (_body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"GET\", `/api/updates/${params.id}/replies`, undefined, scopedQuery(query));\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/board/updates/:id/replies\",\n handler: async (body, params, query) => {\n const boardUrl = getBoardUrl(factoryDir);\n return proxyToBoard(boardUrl, \"POST\", `/api/updates/${params.id}/replies`, body, scopedQuery(query));\n },\n },\n\n // ── Extensions: Plugins ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/plugins\",\n handler: () => {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n return { plugins: {} };\n }\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n return { plugins: lock.plugins || {} };\n } catch {\n return { plugins: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/plugins\",\n handler: async (body) => {\n const { source } = body as { source?: string };\n if (!source) throw new Error(\"Missing required field: source\");\n await installPlugin(factoryDir, source);\n return { success: true, source };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/plugins/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removePlugin(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Registry ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/registry\",\n handler: async () => {\n try {\n const index = await fetchRegistryIndex(factoryDir);\n return index;\n } catch (err) {\n // Return empty registry on fetch failure\n return { plugins: [], updated_at: new Date().toISOString() };\n }\n },\n },\n\n // ── Extensions: MCPs ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/mcps\",\n handler: () => {\n try {\n return { servers: listMcps(factoryDir) };\n } catch {\n return { servers: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/mcps\",\n handler: (body) => {\n const { name, command, args, config } = body as {\n name?: string;\n command?: string;\n args?: string[];\n config?: Record<string, unknown>;\n };\n if (!name) throw new Error(\"Missing required field: name\");\n if (!command) throw new Error(\"Missing required field: command\");\n\n addMcp(factoryDir, name, {\n command,\n args: args || [],\n config: config || {},\n source: \"user\",\n enabled: true,\n });\n return { success: true };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/mcps/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removeMcp(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Skills ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/skills\",\n handler: () => {\n try {\n return { skills: listSkills(factoryDir) };\n } catch {\n return { skills: [] };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/skills\",\n handler: (body) => {\n const { name, description, body: skillBody } = body as {\n name?: string;\n description?: string;\n body?: string;\n };\n if (!name) throw new Error(\"Missing required field: name\");\n if (!description) throw new Error(\"Missing required field: description\");\n if (!skillBody) throw new Error(\"Missing required field: body\");\n const created = createSkill(factoryDir, name, description, skillBody);\n return { success: true, ...created };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/skills/:name\",\n handler: (_body, params) => {\n const { name } = params;\n removeSkill(factoryDir, name);\n return { success: true };\n },\n },\n\n // ── Extensions: Hooks ──\n {\n method: \"GET\",\n pattern: \"/api/extensions/hooks\",\n handler: () => {\n try {\n return { hooks: listHooks(factoryDir) };\n } catch {\n return { hooks: {} };\n }\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/extensions/hooks\",\n handler: (body) => {\n const { event, name, command, skill, webhook, config } = body as {\n event?: string;\n name?: string;\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n };\n if (!event) throw new Error(\"Missing required field: event\");\n if (!name) throw new Error(\"Missing required field: name\");\n if (!command && !skill && !webhook) {\n throw new Error(\"At least one of command, skill, or webhook is required\");\n }\n\n addHook(factoryDir, event as HookEvent, {\n name,\n command,\n skill,\n webhook,\n config: config || {},\n source: \"user\",\n });\n return { success: true };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/extensions/hooks/:event/:name\",\n handler: (_body, params) => {\n const { event, name } = params;\n removeHook(factoryDir, event as HookEvent, name);\n return { success: true };\n },\n },\n\n // ── Projects ──\n {\n method: \"GET\",\n pattern: \"/api/projects\",\n handler: () => {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return { projects: [] };\n\n const projects: unknown[] = [];\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n // Subdirectory format: projects/{name}/project.json\n const subDirPath = join(projectsDir, entry, \"project.json\");\n if (existsSync(subDirPath)) {\n try { projects.push(JSON.parse(readFileSync(subDirPath, \"utf-8\"))); } catch { /* skip */ }\n continue;\n }\n // Flat format: projects/{name}.json (legacy)\n if (entry.endsWith(\".json\")) {\n try { projects.push(JSON.parse(readFileSync(join(projectsDir, entry), \"utf-8\"))); } catch { /* skip */ }\n }\n }\n\n return { projects };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/projects/:name\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n // Try subdirectory format first, then flat\n const subDirPath = join(factoryDir, \".beastmode\", \"projects\", name, \"project.json\");\n const flatPath = join(factoryDir, \".beastmode\", \"projects\", `${name}.json`);\n const filePath = existsSync(subDirPath) ? subDirPath : flatPath;\n if (!existsSync(filePath)) throw new Error(`Project not found: ${name}`);\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/projects/:name/extensions\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n const extPath = join(factoryDir, \".beastmode\", \"projects\", name, \"extensions.json\");\n if (!existsSync(extPath)) {\n return { plugins: { add: [], remove: [] }, mcps: { add: {}, remove: [] }, skills: { add: [], remove: [] } };\n }\n try {\n return JSON.parse(readFileSync(extPath, \"utf-8\"));\n } catch {\n return { plugins: { add: [], remove: [] }, mcps: { add: {}, remove: [] }, skills: { add: [], remove: [] } };\n }\n },\n },\n {\n // Filesystem browser for the Add Project picker.\n //\n // POST body: { path?: string } — absolute directory to list (default: $HOME)\n //\n // Returns { path, parent, entries: [{name, path, is_dir, has_git}] }.\n // Only directories are returned (the picker only selects dirs).\n // This is behind the board's password auth, so it trusts the caller\n // with full filesystem read access — the daemon's trust boundary\n // already allows cloning arbitrary repos and reading arbitrary code.\n method: \"POST\",\n pattern: \"/api/filesystem/browse\",\n handler: (body) => {\n const { path: queryPath } = (body || {}) as { path?: string };\n const startPath = queryPath || homedir();\n const target = resolve(startPath);\n if (!existsSync(target)) throw new Error(`Path not found: ${target}`);\n const st = statSync(target);\n if (!st.isDirectory()) throw new Error(`Not a directory: ${target}`);\n\n let entries: Array<{ name: string; path: string; is_dir: boolean; has_git: boolean }> = [];\n try {\n entries = readdirSync(target, { withFileTypes: true })\n .filter((d) => d.isDirectory() && !d.name.startsWith(\".\"))\n .map((d) => {\n const full = join(target, d.name);\n return {\n name: d.name,\n path: full,\n is_dir: true,\n has_git: existsSync(join(full, \".git\")),\n };\n })\n .sort((a, b) => a.name.localeCompare(b.name));\n } catch {\n // If we can't list (permission denied etc.), return empty\n entries = [];\n }\n\n const parent = dirname(target);\n return {\n path: target,\n parent: parent !== target ? parent : null,\n entries,\n };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/projects\",\n handler: (body) => {\n const { path: projectPath, github_url, clone_target } = body as {\n path?: string;\n github_url?: string;\n clone_target?: string;\n };\n\n // Ensure .beastmode/projects/ exists before any work (clone, write).\n // On fresh installs (e.g. bind-mounted .beastmode in Docker) only\n // factory.json is present, so writing the project file would ENOENT.\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) mkdirSync(projectsDir, { recursive: true });\n\n let resolvedPath: string;\n\n if (github_url) {\n // Clone mode: validate URL, clone into target dir, then register\n const url = github_url.trim();\n // Accept https://github.com/owner/repo(.git) or git@github.com:owner/repo.git\n if (!/^(https?:\\/\\/|git@)/.test(url)) {\n throw new Error(\"Invalid github_url — must start with https:// or git@\");\n }\n // Derive repo name from URL\n const repoName = url\n .replace(/\\.git$/, \"\")\n .split(/[/:]/)\n .filter(Boolean)\n .pop() || \"\";\n if (!repoName) throw new Error(\"Could not derive repo name from URL\");\n\n // Decide clone target dir\n const baseDir = clone_target\n ? resolve(clone_target)\n : process.env.BEASTMODE_CLONE_DIR\n ? resolve(process.env.BEASTMODE_CLONE_DIR)\n : join(homedir(), \"repos\");\n if (!existsSync(baseDir)) mkdirSync(baseDir, { recursive: true });\n\n resolvedPath = join(baseDir, repoName);\n if (existsSync(resolvedPath)) {\n throw new Error(`Target path already exists: ${resolvedPath} — pick a different clone_target or rename the existing folder`);\n }\n\n // For private github.com repos, inject a credential helper that reads\n // the token from the environment. The helper is a shell snippet that\n // git runs when it needs credentials — the token stays in env, never\n // in argv or in the cloned repo's .git/config.\n // GIT_TERMINAL_PROMPT=0 makes git fail fast instead of hanging when\n // no credentials are available (e.g., inside a container with no TTY).\n const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN || \"\";\n const cloneEnv: NodeJS.ProcessEnv = {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n };\n const gitArgs: string[] = [];\n if (token && /^https:\\/\\/github\\.com\\//i.test(url)) {\n cloneEnv.BEASTMODE_GH_TOKEN = token;\n // Clear any inherited helpers, then install our env-backed helper.\n gitArgs.push(\"-c\", \"credential.helper=\");\n gitArgs.push(\n \"-c\",\n `credential.https://github.com.helper=!f() { echo \"username=x-access-token\"; echo \"password=$BEASTMODE_GH_TOKEN\"; }; f`,\n );\n }\n gitArgs.push(\"clone\", url, resolvedPath);\n // Use spawnSync with argv array (no shell) so the token never appears\n // in any shell-expanded command line.\n const result = spawnSync(\"git\", gitArgs, {\n stdio: \"pipe\",\n timeout: 300000, // 5 min\n env: cloneEnv,\n });\n if (result.status !== 0) {\n const stderr = result.stderr?.toString() || \"\";\n const stdout = result.stdout?.toString() || \"\";\n const errMsg = stderr.trim() || stdout.trim() || (result.error ? result.error.message : `exit ${result.status}`);\n throw new Error(`git clone failed: ${errMsg}`);\n }\n } else if (projectPath) {\n resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) throw new Error(`Directory not found: ${resolvedPath}`);\n } else {\n throw new Error(\"Missing required field: provide either `path` (local) or `github_url` (clone)\");\n }\n\n const projectName = basename(resolvedPath);\n const stack = detectStack(resolvedPath);\n\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n repo: stack.git_remote || undefined,\n stack: {\n detected: stack.framework,\n build_command: stack.suggested_commands.build,\n dev_command: stack.suggested_commands.dev,\n test_command: stack.suggested_commands.test,\n install_command: stack.suggested_commands.install,\n dev_port: stack.dev_port,\n },\n deploy: { target: stack.suggested_deploy },\n plugins: stack.suggested_plugins,\n infra: {\n credentials: {\n mode: \"factory\",\n },\n state_backend: \"auto\",\n },\n };\n\n const projName = projectName;\n const projectFile = join(projectsDir, `${projName}.json`);\n writeFileSync(projectFile, JSON.stringify(projectConfig, null, 2) + \"\\n\", \"utf-8\");\n\n // Create infra directory structure for the project\n const infraDir = join(projectsDir, projName, \"infra\");\n const terraformDir = join(infraDir, \"terraform\");\n const ciDir = join(infraDir, \"ci\");\n mkdirSync(terraformDir, { recursive: true });\n mkdirSync(ciDir, { recursive: true });\n\n return projectConfig;\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/projects/:name\",\n handler: (_body, params) => {\n const { name } = params;\n assertSafeName(name);\n // Support both formats: subdir (projects/{name}/project.json) and flat (projects/{name}.json).\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n const subDir = join(projectsDir, name);\n const flatPath = join(projectsDir, `${name}.json`);\n const hasSubDir = existsSync(join(subDir, \"project.json\"));\n const hasFlat = existsSync(flatPath);\n if (!hasSubDir && !hasFlat) throw new Error(`Project not found: ${name}`);\n // Remove whichever artifacts exist. A project may have BOTH (e.g. flat\n // config + subdir containing brownfield.md) — clean up both.\n if (hasSubDir) rmSync(subDir, { recursive: true, force: true });\n else if (existsSync(subDir)) rmSync(subDir, { recursive: true, force: true });\n if (hasFlat) unlinkSync(flatPath);\n return { success: true };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/projects/:name/analyze\",\n handler: async (_body, params) => {\n const { name } = params;\n // Support both formats: subdir (projects/{name}/project.json) and flat (projects/{name}.json).\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n const subDirConfigPath = join(projectsDir, name, \"project.json\");\n const flatConfigPath = join(projectsDir, `${name}.json`);\n const projPath = existsSync(subDirConfigPath)\n ? subDirConfigPath\n : existsSync(flatConfigPath) ? flatConfigPath : null;\n if (!projPath) throw new Error(`Project not found: ${name}`);\n // For now, create a placeholder brownfield.md\n // Full brownfield analysis will be done by spawning Claude (future enhancement)\n const projConfig = JSON.parse(readFileSync(projPath, \"utf-8\"));\n // brownfield.md always goes in the subdir (strategy.ts and other\n // consumers look there). Create the subdir if the project is in flat\n // form — GET skips empty subdirs so no double-listing.\n const subDir = join(projectsDir, name);\n if (!existsSync(subDir)) mkdirSync(subDir, { recursive: true });\n const brownfieldPath = join(subDir, \"brownfield.md\");\n if (!existsSync(brownfieldPath)) {\n const { detectStack: detectStackFn } = await import(\"../../engine/index.js\");\n let stackInfo = \"Unknown stack\";\n try {\n const stack = detectStackFn(projConfig.path) as unknown as Record<string, unknown>;\n const cmds = stack.suggested_commands as Record<string, unknown> | undefined;\n stackInfo = `Framework: ${stack.framework || \"unknown\"}\\nBuild: ${cmds?.build || \"unknown\"}\\nDev: ${cmds?.dev || \"unknown\"}`;\n } catch { /* ignore */ }\n writeFileSync(brownfieldPath, `# Brownfield Analysis: ${name}\\n\\n${stackInfo}\\n\\nPath: ${projConfig.path}\\n`);\n }\n return { analyzed: true, project: name };\n },\n },\n\n // ── Runs ──\n {\n method: \"GET\",\n pattern: \"/api/runs\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n if (!existsSync(runsDir)) return { runs: [] };\n\n // Collect runs from both flat (runs/run-*) and project-scoped\n // (runs/{project}/run-*) directories.\n const runEntries: { id: string; dir: string; projectId: string }[] = [];\n for (const entry of readdirSync(runsDir)) {\n if (entry.startsWith(\".\")) continue;\n const entryPath = join(runsDir, entry);\n try {\n const children = readdirSync(entryPath);\n if (entry.startsWith(\"run-\")) {\n // Flat layout: runs/run-xxx/\n if (children.length > 0) {\n runEntries.push({ id: entry, dir: entryPath, projectId: \"\" });\n }\n } else {\n // Project-scoped: runs/{project}/run-xxx/\n for (const child of children) {\n if (!child.startsWith(\"run-\") || child.startsWith(\".\")) continue;\n const childPath = join(entryPath, child);\n try {\n const grandchildren = readdirSync(childPath);\n if (grandchildren.length > 0) {\n runEntries.push({ id: child, dir: childPath, projectId: entry });\n }\n } catch { /* skip */ }\n }\n }\n } catch { continue; }\n }\n\n // Deduplicate by run ID — prefer project-scoped over flat\n const deduped = new Map<string, typeof runEntries[0]>();\n for (const entry of runEntries) {\n const existing = deduped.get(entry.id);\n if (!existing || (entry.projectId && !existing.projectId)) {\n deduped.set(entry.id, entry);\n }\n }\n\n const runs = Array.from(deduped.values())\n .sort((a, b) => b.id.localeCompare(a.id))\n .map(({ id, dir, projectId }) => {\n const manifest = readJsonFile(join(dir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(dir, \"checkpoint.json\"));\n const prodVerif = readJsonFile(join(dir, \"prod-verification.json\")) as Record<string, unknown> | null;\n const manifestData = manifest as Record<string, unknown> | null;\n const cpData = checkpoint as Record<string, unknown> | null;\n const prodAcceptFloor = 0.65; // matches daemon config\n // Prod verified = has prod-verification results with satisfaction above floor\n // (ceiling acceptance counts as verified), OR checkpoint terminal state\n const prodSat = prodVerif?.satisfaction as number | undefined;\n const prodVerified = (typeof prodSat === \"number\" && prodSat >= prodAcceptFloor) ||\n (cpData?.current_stage === \"done\") || (cpData?.current_stage === \"shipped\");\n return {\n id,\n taskName: manifestData?.description || manifestData?.task_description || manifestData?.item_name || manifestData?.task_name || id,\n projectId: projectId || (manifestData?.project_id as string) || \"\",\n itemId: manifestData?.item_id || manifestData?.monday_item_id || \"\",\n taskType: manifestData?.task_type || \"\",\n createdAt: manifestData?.created_at || \"\",\n manifest: manifest || {},\n checkpoint: checkpoint || {},\n pinned: isRunPinned(runsDir, id),\n prodVerified,\n };\n });\n\n return { runs };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/runs/:id\",\n handler: (_body, params, query) => {\n const { id } = params;\n const runsDir = getRunsDir(factoryDir);\n // Search flat and project-scoped paths\n let runDir = join(runsDir, id);\n if (!existsSync(runDir)) {\n // Search project subdirs\n for (const proj of readdirSync(runsDir)) {\n if (proj.startsWith(\".\") || proj.startsWith(\"run-\")) continue;\n const candidate = join(runsDir, proj, id);\n if (existsSync(candidate)) { runDir = candidate; break; }\n }\n }\n if (!existsSync(runDir)) throw new Error(`Run not found: ${id}`);\n\n const manifest = readJsonFile(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(runDir, \"checkpoint.json\"));\n\n // Collect iteration data\n const iterationsDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterationsDir)) {\n const iterDirs = readdirSync(iterationsDir).sort();\n for (const iterDir of iterDirs) {\n const satisfaction = readJsonFile(\n join(iterationsDir, iterDir, \"satisfaction.json\")\n );\n iterations.push({\n number: parseInt(iterDir, 10),\n satisfaction: satisfaction || null,\n });\n }\n }\n\n const manifestData = manifest as Record<string, unknown> | null;\n return {\n id,\n taskName: manifestData?.description || manifestData?.task_description || manifestData?.item_name || manifestData?.task_name || id,\n projectId: manifestData?.project_id || \"\",\n itemId: manifestData?.item_id || manifestData?.monday_item_id || \"\",\n taskType: manifestData?.task_type || \"\",\n createdAt: manifestData?.created_at || \"\",\n manifest: manifest || {},\n checkpoint: checkpoint || {},\n iterations,\n };\n },\n },\n\n // ── Archival ──\n {\n method: \"POST\",\n pattern: \"/api/runs/archive\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n let days = 7;\n if (existsSync(configPath)) {\n try { days = (JSON.parse(readFileSync(configPath, \"utf-8\")) as Record<string, unknown>).archive_after_days as number || 7; } catch { /* ignore */ }\n }\n return archiveOldRuns(runsDir, days);\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/runs/:id/pin\",\n handler: (_body, params) => {\n return { pinned: pinRun(getRunsDir(factoryDir), params.id) };\n },\n },\n {\n method: \"DELETE\",\n pattern: \"/api/runs/:id/pin\",\n handler: (_body, params) => {\n return { unpinned: unpinRun(getRunsDir(factoryDir), params.id) };\n },\n },\n\n // ── Config ──\n {\n method: \"GET\",\n pattern: \"/api/config\",\n handler: () => {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const raw: Record<string, unknown> = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n return raw;\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/config\",\n handler: (body) => {\n const updates = body as Record<string, unknown>;\n if (!updates || typeof updates !== \"object\") {\n throw new Error(\"Request body must be a JSON object\");\n }\n\n // Extract force flag (not persisted to disk)\n const force = Boolean(\n (updates as Record<string, unknown>).force ||\n (updates as Record<string, unknown>)._force\n );\n // Strip force from updates so it never lands in config.json\n const updatesClean = { ...(updates as Record<string, unknown>) };\n delete updatesClean.force;\n delete updatesClean._force;\n\n // Update UI config (.beastmode/config.json)\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const current = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n\n // Threshold safety check (feature #7): detect raise, scan active\n // runs, return warning if any are stranded.\n if (!force) {\n const oldPipeline = (current.pipeline || {}) as Record<string, unknown>;\n const newPipeline = ((updatesClean as Record<string, unknown>).pipeline || {}) as Record<string, unknown>;\n\n const oldSat = typeof oldPipeline.satisfaction_threshold === \"number\"\n ? oldPipeline.satisfaction_threshold : null;\n const newSat = typeof newPipeline.satisfaction_threshold === \"number\"\n ? newPipeline.satisfaction_threshold : null;\n const oldFloor = typeof oldPipeline.prod_accept_floor === \"number\"\n ? oldPipeline.prod_accept_floor : null;\n const newFloor = typeof newPipeline.prod_accept_floor === \"number\"\n ? newPipeline.prod_accept_floor : null;\n\n const satRaised = oldSat !== null && newSat !== null && newSat > oldSat;\n const floorRaised = oldFloor !== null && newFloor !== null && newFloor > oldFloor;\n\n if (satRaised || floorRaised) {\n const candidates: number[] = [];\n if (satRaised && newSat !== null) candidates.push(newSat);\n if (floorRaised && newFloor !== null) candidates.push(newFloor);\n const effectiveThreshold = Math.max(...candidates);\n\n const stranded = scanStrandedRuns(\n getRunsDir(factoryDir),\n effectiveThreshold,\n );\n if (stranded.length > 0) {\n return {\n warning: `${stranded.length} active run(s) cannot converge at the new threshold.`,\n stranded_runs: stranded,\n confirm_required: true,\n attempted_threshold: effectiveThreshold,\n old_threshold: satRaised ? oldSat : oldFloor,\n };\n }\n }\n }\n\n const merged = deepMerge(current, updatesClean);\n writeFileSync(configPath, JSON.stringify(merged, null, 2) + \"\\n\", \"utf-8\");\n\n // Sync daemon-relevant fields to daemon config files.\n // The daemon's Pydantic DaemonConfig does not define a `pipeline`\n // section — it reads thresholds from `verification.*` and\n // `convergence.*`. Map factory pipeline keys to their daemon homes\n // explicitly instead of copying into an ignored `pipeline` subtree.\n //\n // We sync to BOTH `beastmode.daemon.json` (bare-metal daemon) and\n // `beastmode.docker.json` (Docker Compose daemon, BEASTMODE_CONFIG\n // points to this in docker-compose.yml) when either exists. Users\n // may deploy either way, and the UI has no way to know which file\n // the running daemon is actually reading.\n const daemonConfigPaths = [\n join(factoryDir, \"config\", \"beastmode.daemon.json\"),\n join(factoryDir, \"config\", \"beastmode.docker.json\"),\n ].filter(existsSync);\n\n // Factory `pipeline.*` keys that map into daemon sections.\n // Keys not listed here (preset, stages) are\n // factory-only and intentionally not synced.\n const pipelineToDaemonMap: Record<string, [string, string]> = {\n satisfaction_threshold: [\"verification\", \"satisfaction_threshold\"],\n prod_accept_floor: [\"verification\", \"prod_accept_floor\"],\n max_iterations: [\"convergence\", \"max_iterations\"],\n fail_fast_threshold: [\"convergence\", \"fail_fast_threshold\"],\n };\n const daemonFields = [\"max_slots\", \"max_projects\", \"poll_interval_seconds\", \"stale_task_hours\", \"runs_path\"];\n const flatDictSections: Array<\"models\" | \"migration_safety\" | \"alerts\" | \"human_gates\"> = [\n \"models\", \"migration_safety\", \"alerts\", \"human_gates\",\n ];\n\n for (const daemonConfigPath of daemonConfigPaths) {\n try {\n const daemonConfig = JSON.parse(readFileSync(daemonConfigPath, \"utf-8\")) as Record<string, unknown>;\n let changed = false;\n for (const field of daemonFields) {\n if (field in merged && merged[field] !== daemonConfig[field]) {\n daemonConfig[field] = merged[field];\n changed = true;\n }\n }\n\n if (merged.pipeline && typeof merged.pipeline === \"object\") {\n const mergedPipeline = merged.pipeline as Record<string, unknown>;\n for (const [srcKey, [section, destKey]] of Object.entries(pipelineToDaemonMap)) {\n if (!(srcKey in mergedPipeline)) continue;\n const val = mergedPipeline[srcKey];\n if (val === undefined) continue;\n if (!daemonConfig[section] || typeof daemonConfig[section] !== \"object\") {\n daemonConfig[section] = {};\n }\n const bucket = daemonConfig[section] as Record<string, unknown>;\n if (bucket[destKey] !== val) {\n bucket[destKey] = val;\n changed = true;\n }\n }\n }\n\n for (const section of flatDictSections) {\n const src = merged[section];\n if (src && typeof src === \"object\") {\n if (!daemonConfig[section] || typeof daemonConfig[section] !== \"object\") {\n daemonConfig[section] = {};\n }\n const bucket = daemonConfig[section] as Record<string, unknown>;\n for (const [k, v] of Object.entries(src as Record<string, unknown>)) {\n if (bucket[k] !== v) {\n bucket[k] = v;\n changed = true;\n }\n }\n }\n }\n\n if (changed) {\n writeFileSync(daemonConfigPath, JSON.stringify(daemonConfig, null, 2) + \"\\n\", \"utf-8\");\n }\n } catch { /* non-fatal — one daemon config file may be malformed */ }\n }\n\n return merged;\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/config/reset\",\n handler: (body) => {\n const { keyPath } = (body || {}) as { keyPath?: string };\n\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const current = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : {};\n\n const result = configReset(current, keyPath);\n writeFileSync(configPath, JSON.stringify(result, null, 2) + \"\\n\", \"utf-8\");\n return result;\n },\n },\n\n // ── Chat History ──\n {\n method: \"GET\",\n pattern: \"/api/chat/history\",\n handler: () => {\n return { conversations: listConversations(factoryDir) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/chat/history/:id\",\n handler: (_body, params) => {\n const messages = loadConversation(factoryDir, params.id);\n return { messages };\n },\n },\n\n // ── Products / Inception ──\n {\n method: \"GET\",\n pattern: \"/api/products\",\n handler: async () => {\n const { listProducts } = await import(\"./inception.js\");\n return { products: listProducts(factoryDir) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/products/:name\",\n handler: async (_body, params) => {\n const { loadInception } = await import(\"./inception.js\");\n const state = loadInception(factoryDir, params.name);\n if (!state) throw new Error(`Product not found: ${params.name}`);\n return state;\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/products/:name/artifact/:artifact\",\n handler: async (_body, params) => {\n const { loadArtifact } = await import(\"./inception.js\");\n const content = loadArtifact(factoryDir, params.name, params.artifact);\n if (!content) throw new Error(`Artifact not found: ${params.artifact}`);\n return { content };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/methodologies\",\n handler: async () => {\n const { listMethodologies } = await import(\"./inception.js\");\n return { methodologies: listMethodologies() };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/products\",\n handler: async (body) => {\n const { productName, idea, methodology, interactionMode } = body as {\n productName?: string; idea?: string; methodology?: string; interactionMode?: string;\n };\n if (!productName || !idea || !methodology) {\n throw new Error(\"Missing required fields: productName, idea, methodology\");\n }\n const { createInceptionState } = await import(\"./inception.js\");\n return createInceptionState(factoryDir, {\n productName,\n idea,\n methodology,\n interactionMode: (interactionMode || \"interactive\") as \"interactive\" | \"semi_autonomous\" | \"fully_autonomous\",\n });\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/products/:name/create-epics\",\n handler: async (_body, params) => {\n const { createEpicsOnBoard } = await import(\"./inception.js\");\n const boardUrl = getBoardUrl(factoryDir);\n return createEpicsOnBoard(factoryDir, params.name, boardUrl);\n },\n },\n\n // ── Learnings ──\n {\n method: \"GET\",\n pattern: \"/api/learnings\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n\n // Collect all retrospective directories: runs/.retrospectives and runs/{project}/.retrospectives\n const retroDirs: string[] = [];\n const rootRetroDir = join(runsDir, \".retrospectives\");\n if (existsSync(rootRetroDir)) retroDirs.push(rootRetroDir);\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n const projectRetroDir = join(runsDir, entry, \".retrospectives\");\n if (existsSync(projectRetroDir)) retroDirs.push(projectRetroDir);\n }\n }\n\n if (retroDirs.length === 0) {\n return { learnings: [], retrospectives: [], wisdom: \"\", wisdomMeta: {} };\n }\n\n const retrospectives: unknown[] = [];\n const learnings: unknown[] = [];\n\n for (const retroDir of retroDirs) {\n const retroFiles = readdirSync(retroDir)\n .filter(f => f.startsWith(\"run-\") && f.endsWith(\".json\"))\n .sort()\n .reverse();\n\n for (const file of retroFiles) {\n const data = readJsonFile(join(retroDir, file));\n if (!data) continue;\n const retro = data as Record<string, unknown>;\n retrospectives.push(retro);\n\n const retroLearnings = Array.isArray(retro.learnings) ? retro.learnings : [];\n for (let i = 0; i < retroLearnings.length; i++) {\n const learning = retroLearnings[i] as Record<string, unknown>;\n learnings.push({\n ...learning,\n _index: i,\n task_name: retro.task_name || \"\",\n task_id: retro.task_id || \"\",\n run_id: retro.run_id || \"\",\n outcome: retro.outcome || \"\",\n analyzed_at: retro.analyzed_at || \"\",\n });\n }\n }\n }\n\n // Read wisdom from the first retro dir that has one (prefer root)\n let wisdom = \"\";\n let wisdomMeta: unknown = {};\n for (const retroDir of retroDirs) {\n const wisdomPath = join(retroDir, \"wisdom.md\");\n if (existsSync(wisdomPath)) {\n wisdom = readFileSync(wisdomPath, \"utf-8\");\n wisdomMeta = readJsonFile(join(retroDir, \"wisdom-meta.json\")) || {};\n break;\n }\n }\n\n return { learnings, retrospectives, wisdom, wisdomMeta };\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/learnings/wisdom/refresh\",\n handler: () => {\n const runsDir = getRunsDir(factoryDir);\n const retroDir = join(runsDir, \".retrospectives\");\n if (!existsSync(retroDir)) {\n mkdirSync(retroDir, { recursive: true });\n }\n writeFileSync(join(retroDir, \".refresh-requested\"), new Date().toISOString(), \"utf-8\");\n return { success: true };\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/learnings/:runId/:index/dismiss\",\n handler: (_body, params) => {\n // Search for the retrospective file across all retro dirs\n const runsDir = getRunsDir(factoryDir);\n const candidateDirs = [join(runsDir, \".retrospectives\")];\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n candidateDirs.push(join(runsDir, entry, \".retrospectives\"));\n }\n }\n let filePath: string | null = null;\n for (const dir of candidateDirs) {\n const candidate = join(dir, `${params.runId}.json`);\n if (existsSync(candidate)) { filePath = candidate; break; }\n }\n if (!filePath) throw new Error(`Retrospective not found: ${params.runId}`);\n const data = JSON.parse(readFileSync(filePath, \"utf-8\"));\n const idx = parseInt(params.index, 10);\n if (!Array.isArray(data.learnings) || idx < 0 || idx >= data.learnings.length) {\n throw new Error(`Learning index out of range: ${idx}`);\n }\n data.learnings[idx].dismissed = true;\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n return { success: true };\n },\n },\n {\n method: \"PATCH\",\n pattern: \"/api/learnings/:runId/:index/restore\",\n handler: (_body, params) => {\n // Search for the retrospective file across all retro dirs\n const runsDir = getRunsDir(factoryDir);\n const candidateDirs = [join(runsDir, \".retrospectives\")];\n if (existsSync(runsDir)) {\n for (const entry of readdirSync(runsDir)) {\n if (entry === \".retrospectives\" || entry.startsWith(\".\")) continue;\n candidateDirs.push(join(runsDir, entry, \".retrospectives\"));\n }\n }\n let filePath: string | null = null;\n for (const dir of candidateDirs) {\n const candidate = join(dir, `${params.runId}.json`);\n if (existsSync(candidate)) { filePath = candidate; break; }\n }\n if (!filePath) throw new Error(`Retrospective not found: ${params.runId}`);\n const data = JSON.parse(readFileSync(filePath, \"utf-8\"));\n const idx = parseInt(params.index, 10);\n if (!Array.isArray(data.learnings) || idx < 0 || idx >= data.learnings.length) {\n throw new Error(`Learning index out of range: ${idx}`);\n }\n data.learnings[idx].dismissed = false;\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n return { success: true };\n },\n },\n\n // ── Strategy ──\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions\",\n handler: async (_body, params) => {\n const { migrateInceptionToSession } = await import(\"./inception.js\");\n migrateInceptionToSession(factoryDir, params.project);\n const { listStrategySessions } = await import(\"./strategy.js\");\n return { sessions: listStrategySessions(factoryDir, params.project) };\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions/:sessionId\",\n handler: async (_body, params) => {\n const { loadStrategySession } = await import(\"./strategy.js\");\n const session = loadStrategySession(factoryDir, params.project, params.sessionId);\n if (!session) throw new Error(`Session not found: ${params.sessionId}`);\n return session;\n },\n },\n {\n method: \"POST\",\n pattern: \"/api/strategy/:project/sessions\",\n handler: async (body, params) => {\n const { name, idea, methodology, interactionMode, buildOnSession, sessionType, approach } = body as Record<string, string>;\n if (!name || !idea || !methodology) throw new Error(\"Missing: name, idea, methodology\");\n const { createStrategySession } = await import(\"./strategy.js\");\n return createStrategySession(factoryDir, params.project, {\n name, idea, methodology,\n interactionMode: interactionMode || \"interactive\",\n buildOnSession,\n sessionType: sessionType || \"free-form\",\n approach: approach || \"auto\",\n });\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/index\",\n handler: async (_body, params) => {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n return buildArtifactIndex(factoryDir, params.project);\n },\n },\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/sessions/:sessionId/artifact/:artifact\",\n handler: async (_body, params) => {\n const { loadSessionArtifact } = await import(\"./strategy.js\");\n const content = loadSessionArtifact(factoryDir, params.project, params.sessionId, params.artifact);\n if (!content) throw new Error(`Artifact not found: ${params.artifact}`);\n return { content };\n },\n },\n\n // ── Strategy Feed (aggregated activity) ──\n {\n method: \"GET\",\n pattern: \"/api/strategy/:project/feed\",\n handler: async (_body, params, query) => {\n const project = params.project;\n const limit = Math.min(Math.max(parseInt(query?.limit || \"20\", 10) || 20, 1), 50);\n const cursor = query?.cursor || null;\n\n interface FeedItem {\n type: string;\n title: string;\n subtitle?: string;\n timestamp: string;\n link?: string;\n id: string;\n }\n\n const allItems: FeedItem[] = [];\n\n // Source 1: Strategy sessions\n try {\n const { listStrategySessions } = await import(\"./strategy.js\");\n const sessions = listStrategySessions(factoryDir, project);\n for (const s of sessions) {\n const phasesDone = s.phases ? s.phases.filter(p => p.status === \"done\").length : 0;\n const phasesTotal = s.phases ? s.phases.length : 0;\n const typeLabel = s.sessionType || \"free-form\";\n const methodLabel = s.methodology || \"\";\n let subtitle = `${typeLabel} (${methodLabel})`;\n if (phasesTotal > 0) {\n subtitle += ` — phase ${phasesDone}/${phasesTotal}`;\n }\n allItems.push({\n type: \"session\",\n title: s.name,\n subtitle,\n timestamp: s.updatedAt || s.createdAt,\n link: `#/strategy-session/${s.sessionId}`,\n id: `session-${s.sessionId}`,\n });\n }\n } catch { /* source unavailable */ }\n\n // Source 2: Decisions (from board server)\n try {\n const boardUrl = getBoardUrl(factoryDir);\n const resp = await proxyToBoard(boardUrl, \"GET\", `/api/strategy/${project}/decisions`);\n const decisions = Array.isArray(resp) ? resp : ((resp as Record<string, unknown>)?.decisions as unknown[] || []);\n for (const d of decisions as Array<Record<string, unknown>>) {\n allItems.push({\n type: \"decision\",\n title: String(d.title || \"Untitled decision\"),\n subtitle: `Status: ${d.status || \"active\"}`,\n timestamp: String(d.updated_at || d.created_at || new Date().toISOString()),\n id: `decision-${d.id}`,\n });\n }\n } catch { /* board unreachable */ }\n\n // Source 3: Board items (tasks)\n try {\n const boardUrl = getBoardUrl(factoryDir);\n const resp = await proxyToBoard(boardUrl, \"GET\", \"/api/items\", undefined, { board: project });\n const tasks = Array.isArray(resp) ? resp : ((resp as Record<string, unknown>)?.items as unknown[] || []);\n for (const t of tasks as Array<Record<string, unknown>>) {\n const parts: string[] = [];\n if (t.status) parts.push(String(t.status));\n if (t.priority) parts.push(`P${t.priority}`);\n if (t.task_type) parts.push(String(t.task_type));\n allItems.push({\n type: \"task\",\n title: String(t.name || \"Untitled task\"),\n subtitle: parts.join(\" / \") || undefined,\n timestamp: String(t.updated_at || t.created_at || new Date().toISOString()),\n link: \"#/board\",\n id: `task-${t.id}`,\n });\n }\n } catch { /* board unreachable */ }\n\n // Source 4: Learnings (from artifact index)\n try {\n const { buildArtifactIndex } = await import(\"./strategy.js\");\n const index = buildArtifactIndex(factoryDir, project);\n const learnings = index.artifacts.filter(a => a.type === \"learning\");\n for (const l of learnings) {\n allItems.push({\n type: \"learning\",\n title: l.summary,\n timestamp: l.date,\n id: `learning-${l.path}`,\n });\n }\n } catch { /* source unavailable */ }\n\n // Source 5: Runs (from filesystem)\n try {\n const runsDir = join(factoryDir, \"runs\", project);\n if (existsSync(runsDir)) {\n const runDirs = readdirSync(runsDir).filter(d => d.startsWith(\"run-\"));\n for (const runId of runDirs) {\n const ckptPath = join(runsDir, runId, \"checkpoint.json\");\n let subtitle = \"\";\n let timestamp = \"\";\n try {\n const st = statSync(join(runsDir, runId));\n timestamp = st.mtime.toISOString();\n } catch {\n timestamp = new Date().toISOString();\n }\n if (existsSync(ckptPath)) {\n try {\n const ckpt = JSON.parse(readFileSync(ckptPath, \"utf-8\"));\n const history = ckpt.satisfaction_history as number[] | undefined;\n if (history && history.length > 0) {\n const latest = history[history.length - 1];\n subtitle = `Satisfaction: ${Math.round(latest * 100)}%`;\n }\n } catch { /* bad checkpoint */ }\n }\n allItems.push({\n type: \"run\",\n title: runId,\n subtitle: subtitle || undefined,\n timestamp,\n link: \"#/runs\",\n id: `run-${runId}`,\n });\n }\n }\n } catch { /* source unavailable */ }\n\n // Sort by timestamp descending\n allItems.sort((a, b) => {\n const ta = new Date(a.timestamp).getTime() || 0;\n const tb = new Date(b.timestamp).getTime() || 0;\n return tb - ta;\n });\n\n // Cursor-based pagination: find cursor position, return next `limit` items\n let startIndex = 0;\n if (cursor) {\n const cursorIdx = allItems.findIndex(item => item.id === cursor);\n if (cursorIdx >= 0) {\n startIndex = cursorIdx + 1;\n }\n }\n\n const page = allItems.slice(startIndex, startIndex + limit);\n const nextCursor = page.length === limit && startIndex + limit < allItems.length\n ? page[page.length - 1].id\n : null;\n\n return {\n items: page,\n total: allItems.length,\n nextCursor,\n };\n },\n },\n ];\n}\n\n// ── Pattern matching for routes with :params ──\n\nexport function matchBoardRoute(\n routes: BoardRoute[],\n method: string,\n url: string\n): { route: BoardRoute; params: Record<string, string> } | null {\n for (const route of routes) {\n if (route.method !== method) continue;\n\n const routeParts = route.pattern.split(\"/\");\n const urlParts = url.split(\"/\");\n\n if (routeParts.length !== urlParts.length) continue;\n\n const params: Record<string, string> = {};\n let match = true;\n\n for (let i = 0; i < routeParts.length; i++) {\n if (routeParts[i].startsWith(\":\")) {\n params[routeParts[i].slice(1)] = decodeURIComponent(urlParts[i]);\n } else if (routeParts[i] !== urlParts[i]) {\n match = false;\n break;\n }\n }\n\n if (match) return { route, params };\n }\n\n return null;\n}\n","import { createServer, type IncomingMessage, type ServerResponse, type Server } from \"http\";\nimport type { Duplex } from \"stream\";\nimport { createHmac } from \"crypto\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { join, dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { WebSocketServer, WebSocket as WsClient } from \"ws\";\nimport { getRoutes, type Route } from \"./api-routes.js\";\nimport { getBoardRoutes, matchBoardRoute, BinaryResponse, HttpError, getBoardUrl, transparentProxyToBoard, type BoardRoute } from \"./board-api-routes.js\";\nimport { createChatManager, getRecentTokenUsage, type ChatManager } from \"./chat-handler.js\";\n\n\n// Single shared WebSocketServer for the /ws proxy — noServer mode so\n// we own the upgrade handshake. Created once at module load; re-used\n// across every client connection. Each proxy connection opens its own\n// outbound WebSocket to the board server.\nconst _boardWsProxy = new WebSocketServer({ noServer: true });\n\n\nfunction proxyBoardWebSocket(\n req: IncomingMessage,\n socket: Duplex,\n head: Buffer,\n boardWsUrl: string,\n): void {\n // Complete the upgrade on the browser side first, THEN open the\n // upstream connection to the board. If the upstream is down, we\n // close the browser side with a clear reason instead of leaving\n // the handshake half-done.\n _boardWsProxy.handleUpgrade(req, socket, head, (clientWs) => {\n const upstream = new WsClient(boardWsUrl);\n let closed = false;\n const cleanup = (code: number, reason: string) => {\n if (closed) return;\n closed = true;\n try { clientWs.close(code, reason); } catch { /* noop */ }\n try { upstream.close(code, reason); } catch { /* noop */ }\n };\n\n upstream.on(\"open\", () => {\n clientWs.on(\"message\", (data) => {\n try { upstream.send(data); } catch { cleanup(1011, \"relay failed\"); }\n });\n upstream.on(\"message\", (data) => {\n try { clientWs.send(data); } catch { cleanup(1011, \"relay failed\"); }\n });\n });\n\n upstream.on(\"error\", () => cleanup(1011, \"board WS upstream error\"));\n upstream.on(\"close\", (code, reason) => cleanup(code || 1000, reason?.toString() || \"upstream closed\"));\n clientWs.on(\"error\", () => cleanup(1011, \"client WS error\"));\n clientWs.on(\"close\", (code, reason) => cleanup(code || 1000, reason?.toString() || \"client closed\"));\n });\n}\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nconst INACTIVITY_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes\n\nexport interface ServerOptions {\n port?: number;\n host?: string;\n projectPath?: string;\n factoryName?: string;\n factoryPath?: string;\n mode?: \"init\" | \"board\";\n}\n\nexport interface UIServer {\n server: Server;\n port: number;\n url: string;\n shutdown: () => Promise<void>;\n}\n\nfunction resolveStaticDir(): string {\n // In development: src/cli/ui/static/\n const devPath = join(__dirname, \"static\");\n if (existsSync(join(devPath, \"index.html\"))) {\n return devPath;\n }\n // When built with tsup (single-file bundle), __dirname is dist/\n // Static files are at dist/web/\n const distWebPath = join(__dirname, \"web\");\n if (existsSync(join(distWebPath, \"index.html\"))) {\n return distWebPath;\n }\n // Fallback: dist/../web (cli/web/)\n const siblingPath = join(__dirname, \"..\", \"web\");\n if (existsSync(join(siblingPath, \"index.html\"))) {\n return siblingPath;\n }\n throw new Error(\n `Cannot find static files. Checked:\\n ${devPath}\\n ${distWebPath}\\n ${siblingPath}`\n );\n}\n\nexport function parseBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\n if (!raw) {\n resolve({});\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\nexport function sendJson(res: ServerResponse, statusCode: number, data: unknown): void {\n const body = JSON.stringify(data);\n res.writeHead(statusCode, {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(body),\n });\n res.end(body);\n}\n\nfunction sendHtml(res: ServerResponse, html: string): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(html),\n \"Cache-Control\": \"no-cache, no-store, must-revalidate\",\n \"Pragma\": \"no-cache\",\n \"Expires\": \"0\",\n });\n res.end(html);\n}\n\n// ── Authentication ──\n\nconst UI_PASSWORD = process.env.BEASTMODE_UI_PASSWORD || \"\";\nconst AUTH_COOKIE_NAME = \"bm_session\";\nconst AUTH_COOKIE_MAX_AGE = 86400; // 24 hours\n\nfunction signToken(password: string): string {\n return createHmac(\"sha256\", password).update(\"beastmode-authenticated\").digest(\"hex\");\n}\n\nfunction isAuthenticated(req: IncomingMessage): boolean {\n if (!UI_PASSWORD) return true; // No password set — auth disabled\n const cookie = req.headers.cookie || \"\";\n const match = cookie.split(\";\").find((c) => c.trim().startsWith(`${AUTH_COOKIE_NAME}=`));\n if (!match) return false;\n const token = match.split(\"=\")[1]?.trim();\n return token === signToken(UI_PASSWORD);\n}\n\nfunction isAuthExempt(method: string, url: string): boolean {\n if (url === \"/auth/login\" && method === \"POST\") return true;\n if (url === \"/auth/login\" && method === \"GET\") return true;\n if (url === \"/auth/logout\") return true;\n if (url.startsWith(\"/static/\")) return true; // CSS/images for login page\n if (url === \"/health\" && method === \"GET\") return true;\n if (url === \"/api/build-stamp\" && method === \"GET\") return true;\n if (url === \"/api/token-usage/recent\" && method === \"GET\") return true;\n return false;\n}\n\nfunction setSessionCookie(res: ServerResponse): void {\n const token = signToken(UI_PASSWORD);\n res.setHeader(\"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=${token}; Path=/; HttpOnly; SameSite=Lax; Max-Age=${AUTH_COOKIE_MAX_AGE}`\n );\n}\n\nfunction clearSessionCookie(res: ServerResponse): void {\n res.setHeader(\"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`\n );\n}\n\nconst LOGIN_PAGE = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>BeastMode — Login</title>\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/static/favicon.svg\">\n <style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;\n background: #0a0a0a; color: #f0f0f0; display: flex; align-items: center;\n justify-content: center; min-height: 100vh; padding: 24px; }\n .login-card { background: #141414; border: 1px solid #2a2a2a; border-radius: 12px;\n padding: 36px 40px 32px; width: 100%; max-width: 400px; text-align: center;\n box-shadow: 0 8px 32px rgba(0,0,0,0.4); }\n .login-logo { width: 260px; height: auto; display: block; margin: 0 auto 20px; }\n .login-logo .body { fill: #f0f0f0; }\n .login-logo .win { fill: #141414; }\n .login-logo .wm { fill: #f0f0f0; }\n .login-logo .sub { fill: #666; }\n .login-logo .amber { fill: #F5A623; }\n .login-logo .amber-s { stroke: #F5A623; fill: none; }\n .login-card p { font-size: 13px; color: #999; margin-bottom: 24px; letter-spacing: 0.3px; }\n .login-card input { width: 100%; padding: 12px 16px; background: #1a1a1a;\n border: 1px solid #2a2a2a; border-radius: 8px; color: #f0f0f0;\n font-size: 15px; outline: none; margin-bottom: 14px;\n transition: border-color 0.15s ease; font-family: inherit; }\n .login-card input:focus { border-color: #F5A623; box-shadow: 0 0 0 3px rgba(245,166,35,0.15); }\n .login-card input::placeholder { color: #666; }\n .login-card button { width: 100%; padding: 12px; background: #F5A623; color: #1a1a1a;\n border: none; border-radius: 8px; font-size: 15px; font-weight: 600;\n cursor: pointer; transition: background 0.15s ease; font-family: inherit; }\n .login-card button:hover { background: #E5961A; }\n .error { color: #f87171; font-size: 13px; margin-bottom: 12px; display: none; }\n .attribution { margin-top: 18px; font-size: 11px; color: #666; letter-spacing: 0.3px; }\n .attribution a { color: #999; text-decoration: none; transition: color 0.15s ease; }\n .attribution a:hover { color: #F5A623; }\n </style>\n</head>\n<body>\n <div class=\"login-card\">\n <svg class=\"login-logo\" viewBox=\"0 0 400 320\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"BeastMode — Dark Factory\">\n <g transform=\"translate(200,130)\">\n <rect class=\"body\" x=\"-52\" y=\"8\" width=\"62\" height=\"56\" rx=\"2\"/>\n <rect class=\"body\" x=\"12\" y=\"-12\" width=\"44\" height=\"76\" rx=\"2\"/>\n <rect class=\"body\" x=\"20\" y=\"-50\" width=\"13\" height=\"42\" rx=\"1.5\"/>\n <rect class=\"body\" x=\"39\" y=\"-32\" width=\"10\" height=\"24\" rx=\"1.5\"/>\n <rect class=\"win\" x=\"-43\" y=\"18\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-28\" y=\"18\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-43\" y=\"34\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"-28\" y=\"34\" width=\"10\" height=\"9\" rx=\"1\"/>\n <rect class=\"win\" x=\"20\" y=\"0\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"38\" y=\"0\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"20\" y=\"18\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"win\" x=\"38\" y=\"18\" width=\"10\" height=\"10\" rx=\"1\"/>\n <rect class=\"body\" x=\"-58\" y=\"64\" width=\"120\" height=\"3\" rx=\"1.5\"/>\n <line class=\"amber-s\" x1=\"26\" y1=\"-54\" x2=\"26\" y2=\"-98\" stroke-width=\"3.5\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"26,-98 17,-82 35,-82\"/>\n <line class=\"amber-s\" x1=\"14\" y1=\"-56\" x2=\"5\" y2=\"-80\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"5,-80 0,-70 10,-70\"/>\n <line class=\"amber-s\" x1=\"40\" y1=\"-46\" x2=\"48\" y2=\"-72\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <polygon class=\"amber\" points=\"48,-72 43,-62 53,-62\"/>\n <circle class=\"amber\" cx=\"26\" cy=\"-108\" r=\"3\"/>\n <circle class=\"amber\" cx=\"0\" cy=\"-86\" r=\"1.8\"/>\n <circle class=\"amber\" cx=\"53\" cy=\"-78\" r=\"1.8\"/>\n <circle class=\"amber\" cx=\"13\" cy=\"-96\" r=\"1.5\"/>\n <circle class=\"amber\" cx=\"42\" cy=\"-88\" r=\"1.3\"/>\n </g>\n <text class=\"wm\" x=\"200\" y=\"255\" text-anchor=\"middle\" font-family=\"system-ui,-apple-system,sans-serif\" font-size=\"30\" font-weight=\"500\" letter-spacing=\"7\">BEASTMODE</text>\n <text class=\"sub\" x=\"200\" y=\"280\" text-anchor=\"middle\" font-family=\"system-ui,-apple-system,sans-serif\" font-size=\"11\" letter-spacing=\"4\">DARK FACTORY</text>\n </svg>\n <p>Enter password to access the board</p>\n <div class=\"error\" id=\"error\">Invalid password</div>\n <form id=\"form\">\n <input type=\"password\" name=\"password\" placeholder=\"Password\" autofocus />\n <button type=\"submit\">Login</button>\n </form>\n <div class=\"attribution\">by <a href=\"https://develeap.com\" target=\"_blank\" rel=\"noopener noreferrer\">develeap</a></div>\n </div>\n <script>\n document.getElementById('form').addEventListener('submit', async (e) => {\n e.preventDefault();\n const password = e.target.password.value;\n const res = await fetch('/auth/login', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ password }),\n });\n if (res.ok) {\n window.location.href = '/';\n } else {\n const err = document.getElementById('error');\n err.style.display = 'block';\n e.target.password.value = '';\n e.target.password.focus();\n }\n });\n </script>\n</body>\n</html>`;\n\nexport async function findAvailablePort(start: number): Promise<number> {\n for (let port = start; port < start + 100; port++) {\n const available = await new Promise<boolean>((resolve) => {\n const testServer = createServer();\n testServer.once(\"error\", () => resolve(false));\n testServer.listen(port, \"127.0.0.1\", () => {\n testServer.close(() => resolve(true));\n });\n });\n if (available) return port;\n }\n throw new Error(`No available port found in range ${start}-${start + 99}`);\n}\n\nexport async function startServer(options: ServerOptions = {}): Promise<UIServer> {\n const port = await findAvailablePort(options.port || 7669);\n const mode = options.mode || \"init\";\n const initRoutes = getRoutes();\n const boardRoutes: BoardRoute[] = options.factoryPath\n ? getBoardRoutes(options.factoryPath)\n : [];\n\n let staticDir: string;\n\n try {\n staticDir = resolveStaticDir();\n } catch {\n staticDir = \"\";\n }\n\n // Re-read the HTML files on EVERY request so that docker cp / rsync /\n // file-watcher updates take effect without a container restart. The\n // old behaviour (readFileSync once at startup, cache in memory) was a\n // debugging footgun — hot-copying a new board.html into the running\n // container silently did nothing because this process still served the\n // cached string. Observed 2026-04-14 during Story 1 / Story 3 recovery.\n //\n // Per-request fs.readFileSync on a local disk is ~200µs, fully\n // acceptable for a local dev UI that handles maybe 1 request/second.\n // For production deployments serving high traffic, add an ETag /\n // mtime-based cache — out of scope here. See\n // docs/zero-to-productive-readiness.md Gap 10.\n function loadIndexHtml(): string {\n const fallback = \"<html><body><h1>BeastMode Init Wizard</h1><p>Static files not found.</p></body></html>\";\n if (!staticDir) return fallback;\n try {\n const indexPath = join(staticDir, \"index.html\");\n if (!existsSync(indexPath)) return fallback;\n return readFileSync(indexPath, \"utf-8\");\n } catch {\n return fallback;\n }\n }\n\n // Returns the board HTML, or null if the artifact is missing/unreadable.\n // Callers must distinguish these cases so the HTTP response can signal\n // \"deploy broken\" (503 + header) instead of \"feature missing\" (200 + stub).\n // Without this split, the verifier treats a broken deploy as a code bug\n // and fail-fast bounces the task to spec review. See #39/#45 on\n // 2026-04-18.\n function loadBoardHtml(): string | null {\n try {\n const dir = staticDir || resolveStaticDir();\n const boardPath = join(dir, \"board.html\");\n if (!existsSync(boardPath)) return null;\n return readFileSync(boardPath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n // Chat manager for Claude Code integration\n let chatManager: ChatManager | null = null;\n if (options.factoryPath) {\n chatManager = createChatManager();\n }\n\n let inactivityTimer: ReturnType<typeof setTimeout>;\n let shutdownResolve: (() => void) | null = null;\n\n function resetInactivityTimer(): void {\n clearTimeout(inactivityTimer);\n inactivityTimer = setTimeout(() => {\n shutdown();\n }, INACTIVITY_TIMEOUT_MS);\n }\n\n function matchInitRoute(method: string, url: string): Route | undefined {\n return initRoutes.find((r) => r.method === method && r.path === url);\n }\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n resetInactivityTimer();\n\n const method = req.method || \"GET\";\n const rawUrl = req.url || \"/\";\n const queryStart = rawUrl.indexOf(\"?\");\n const url = queryStart === -1 ? rawUrl : rawUrl.slice(0, queryStart);\n const rawQuery = queryStart === -1 ? \"\" : rawUrl.slice(queryStart + 1);\n const query: Record<string, string> = {};\n if (rawQuery) {\n for (const part of rawQuery.split(\"&\")) {\n if (!part) continue;\n const eq = part.indexOf(\"=\");\n if (eq === -1) {\n query[decodeURIComponent(part)] = \"\";\n } else {\n query[decodeURIComponent(part.slice(0, eq))] = decodeURIComponent(part.slice(eq + 1));\n }\n }\n }\n\n // ── Auth gate ──\n if (UI_PASSWORD && !isAuthExempt(method, url) && !isAuthenticated(req)) {\n res.writeHead(302, { Location: \"/auth/login\" });\n res.end();\n return;\n }\n\n // Auth routes\n if (url === \"/auth/login\" && method === \"GET\") {\n if (!UI_PASSWORD || isAuthenticated(req)) {\n res.writeHead(302, { Location: \"/\" });\n res.end();\n } else {\n sendHtml(res, LOGIN_PAGE);\n }\n return;\n }\n if (url === \"/auth/login\" && method === \"POST\") {\n try {\n const body = await parseBody(req) as { password?: string };\n if (body.password && body.password === UI_PASSWORD) {\n setSessionCookie(res);\n sendJson(res, 200, { success: true });\n } else {\n sendJson(res, 401, { error: \"Invalid password\" });\n }\n } catch {\n sendJson(res, 400, { error: \"Bad request\" });\n }\n return;\n }\n if (url === \"/auth/logout\") {\n clearSessionCookie(res);\n res.writeHead(302, { Location: \"/auth/login\" });\n res.end();\n return;\n }\n\n // Health check endpoint (no auth required)\n if (method === \"GET\" && url === \"/health\") {\n sendJson(res, 200, { status: \"ok\", uptime: process.uptime() });\n return;\n }\n\n // Build stamp endpoint — deploy-truth anchor.\n //\n // Returns the build marker the verifier uses to confirm it is testing the\n // commit it was asked to test. Without this check, a stale slot-sync copy\n // or transient deploy glitch looks like a 0% feature failure instead of\n // the infra failure it actually is — that confusion burned stories\n // #39, #44, #45 on 2026-04-18. See also:\n // daemon/beastmode_daemon/pipeline/verify_production.py pre-flight.\n // Recent chat token usage (Story 3 — FR-5). Returns the in-memory\n // ring buffer of token records captured from runViaApi / runViaCli.\n // Empty array when no chat messages have been sent since boot.\n if (method === \"GET\" && url === \"/api/token-usage/recent\") {\n sendJson(res, 200, getRecentTokenUsage());\n return;\n }\n\n if (method === \"GET\" && url === \"/api/build-stamp\") {\n let stamp = \"unknown\";\n let commit_sha: string | null = null;\n try {\n const dir = staticDir || resolveStaticDir();\n const stampPath = join(dir, \"build-stamp.txt\");\n if (existsSync(stampPath)) {\n stamp = readFileSync(stampPath, \"utf-8\").trim();\n }\n const commitPath = join(dir, \"build-commit.txt\");\n if (existsSync(commitPath)) {\n commit_sha = readFileSync(commitPath, \"utf-8\").trim() || null;\n }\n } catch {\n /* fallback — leave as unknown / null */\n }\n sendJson(res, 200, { stamp, commit_sha, service: \"ui\" });\n return;\n }\n\n // Board API routes (pattern matching with :params)\n if (boardRoutes.length > 0) {\n const boardMatch = matchBoardRoute(boardRoutes, method, url);\n if (boardMatch) {\n try {\n let body: unknown = undefined;\n if (method === \"POST\" || method === \"PATCH\") {\n body = await parseBody(req);\n }\n const result = await boardMatch.route.handler(body, boardMatch.params, query);\n // Binary responses (attachment downloads etc. — Gap 8a)\n // return a BinaryResponse sentinel that we serialize as\n // raw bytes with the original Content-Type. Everything\n // else goes through the JSON encoder.\n if (result instanceof BinaryResponse) {\n const headers: Record<string, string | number> = {\n \"Content-Type\": result.contentType,\n \"Content-Length\": result.body.length,\n };\n if (result.filename) {\n headers[\"Content-Disposition\"] =\n `inline; filename=\"${result.filename.replace(/\"/g, \"\")}\"`;\n }\n res.writeHead(200, headers);\n res.end(result.body);\n } else {\n sendJson(res, 200, result);\n }\n } catch (err) {\n if (err instanceof HttpError) {\n sendJson(res, err.statusCode, err.body);\n } else {\n const message = err instanceof Error ? err.message : \"Internal server error\";\n sendJson(res, 500, { error: message });\n }\n }\n return;\n }\n }\n\n // Init API routes (exact match)\n const initRoute = matchInitRoute(method, url);\n if (initRoute) {\n try {\n let body: unknown = undefined;\n if (method === \"POST\") {\n body = await parseBody(req);\n }\n const result = await initRoute.handler(body);\n\n // Check if scaffold was called — signal shutdown after delay (init mode only)\n if (\n mode === \"init\" &&\n url === \"/api/scaffold\" &&\n (result as Record<string, unknown>).success\n ) {\n setTimeout(() => shutdown(), 3000);\n }\n\n sendJson(res, 200, result);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Internal server error\";\n sendJson(res, 500, { error: message });\n }\n return;\n }\n\n // Chat API routes\n if (chatManager && options.factoryPath) {\n if (method === \"POST\" && url === \"/api/chat/start\") {\n const session = chatManager.startSession(options.factoryPath);\n sendJson(res, 200, { sessionId: session.id });\n return;\n }\n if (method === \"POST\" && url === \"/api/chat/stop\") {\n try {\n const body = await parseBody(req) as { sessionId?: string };\n if (body.sessionId) {\n chatManager.stopSession(body.sessionId);\n }\n } catch { /* ignore */ }\n sendJson(res, 200, { success: true });\n return;\n }\n }\n\n // Serve static assets (images)\n if (method === \"GET\" && url.startsWith(\"/static/\")) {\n const filename = url.slice(\"/static/\".length);\n const filePath = staticDir ? join(staticDir, filename) : \"\";\n if (filePath && existsSync(filePath)) {\n const ext = filename.split(\".\").pop()?.toLowerCase();\n const mimeTypes: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n svg: \"image/svg+xml\",\n ico: \"image/x-icon\",\n };\n const contentType = mimeTypes[ext || \"\"] || \"application/octet-stream\";\n const content = readFileSync(filePath);\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": content.length.toString(),\n \"Cache-Control\": \"public, max-age=60, must-revalidate\",\n });\n res.end(content);\n return;\n }\n }\n\n // Static file serving\n if (method === \"GET\") {\n // Board page\n if (url === \"/board\" || url === \"/board.html\") {\n // Re-read board.html on every request so docker cp and live\n // file edits take effect without a container restart. See\n // loadBoardHtml() above + docs/zero-to-productive-readiness.md\n // Gap 10.\n let html = loadBoardHtml();\n if (html === null) {\n const body = \"<html><body><h1>BeastMode Board</h1><p>Artifact missing — deploy pipeline produced an unreadable board.html. This is an infrastructure failure, not a feature bug.</p></body></html>\";\n res.writeHead(503, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(body),\n \"Cache-Control\": \"no-store\",\n \"X-Beastmode-Artifact-Status\": \"missing\",\n });\n res.end(body);\n return;\n }\n if (options.factoryPath || options.factoryName) {\n const boardData = JSON.stringify({\n factoryPath: options.factoryPath || \"\",\n factoryName: options.factoryName || \"\",\n });\n html = html.replace(\n \"<!--BOARD_DATA-->\",\n `<script>window.__BOARD_DATA__ = ${boardData};</script>`\n );\n }\n sendHtml(res, html);\n return;\n }\n\n // Init wizard (index.html)\n if (url === \"/\" || url === \"/index.html\") {\n if (mode === \"board\") {\n // In board mode, redirect root to /board\n res.writeHead(302, { Location: \"/board\" });\n res.end();\n return;\n }\n // Same rationale as loadBoardHtml — re-read on every request.\n let html = loadIndexHtml();\n if (options.factoryName || options.projectPath) {\n const initData = JSON.stringify({\n factoryName: options.factoryName || \"\",\n projectPath: options.projectPath || \"\",\n });\n html = html.replace(\n \"<!--INIT_DATA-->\",\n `<script>window.__INIT_DATA__ = ${initData};</script>`\n );\n }\n sendHtml(res, html);\n return;\n }\n }\n\n // Gap 8 — transparent fallback proxy for unmatched /api/* routes.\n // Reaches here only if the URL didn't match any explicit board route\n // (with path rewrites), any init route, or any chat route. Forwards\n // the request unchanged to the board service so new backend routes\n // become reachable from the UI without requiring a manual allowlist\n // entry. Preserves the board's status code and content-type.\n if (\n url.startsWith(\"/api/\") &&\n boardRoutes.length > 0 &&\n options.factoryPath &&\n (method === \"GET\" || method === \"POST\" || method === \"PATCH\" || method === \"DELETE\")\n ) {\n try {\n const body =\n method === \"POST\" || method === \"PATCH\"\n ? await parseBody(req)\n : undefined;\n const proxied = await transparentProxyToBoard(\n getBoardUrl(options.factoryPath),\n method,\n url.split(\"?\")[0],\n body,\n query,\n );\n res.writeHead(proxied.statusCode, { \"Content-Type\": proxied.contentType });\n res.end(proxied.body);\n return;\n } catch {\n // Fall through to 404 if the board is unreachable.\n }\n }\n\n // 404\n sendJson(res, 404, { error: \"Not found\" });\n });\n\n // Handle WebSocket upgrades for chat AND board real-time updates.\n // The board.html client opens ws://localhost:8420/ws for real-time\n // task updates (cost events, status changes). The Python board\n // server at board:8080 publishes these via its ConnectionManager;\n // we proxy them here so browsers on :8420 can subscribe. Without\n // this proxy, the client reconnects every 3s hitting 404 forever —\n // observed by Agent C on 2026-04-19. Chat uses /ws/chat, a separate\n // path owned by chatManager.\n server.on(\"upgrade\", (req, socket, head) => {\n const url = (req.url || \"\").split(\"?\")[0];\n if (url === \"/ws/chat\") {\n if (!chatManager) {\n socket.write(\"HTTP/1.1 503 Service Unavailable\\r\\n\\r\\n\");\n socket.end();\n return;\n }\n // Auto-create a session if none exists so the WebSocket endpoint\n // is reachable without a prior POST /api/chat/start (required for\n // browser-based verification scenarios that connect directly).\n if (options.factoryPath && chatManager.sessions.size === 0) {\n chatManager.startSession(options.factoryPath);\n }\n chatManager.handleUpgrade(req, socket, head);\n return;\n }\n if (url === \"/ws\") {\n // Proxy to board server's /ws. Relay bidirectionally and close\n // cleanly when either end disconnects.\n const factoryDir = options.factoryPath || process.cwd();\n const boardUrl = getBoardUrl(factoryDir);\n // Convert http://board:8080 → ws://board:8080/ws (handles https→wss too).\n const wsBoardUrl = boardUrl.replace(/^http/, \"ws\").replace(/\\/$/, \"\") + \"/ws\";\n proxyBoardWebSocket(req, socket, head, wsBoardUrl);\n return;\n }\n socket.write(\"HTTP/1.1 404 Not Found\\r\\n\\r\\n\");\n socket.end();\n });\n\n async function shutdown(): Promise<void> {\n clearTimeout(inactivityTimer);\n if (chatManager) {\n chatManager.shutdown();\n }\n return new Promise<void>((resolve) => {\n server.close(() => {\n if (shutdownResolve) shutdownResolve();\n resolve();\n });\n // Force close after 2 seconds\n setTimeout(() => {\n if (shutdownResolve) shutdownResolve();\n resolve();\n }, 2000);\n });\n }\n\n return new Promise<UIServer>((resolve, reject) => {\n server.once(\"error\", reject);\n const host = options.host || \"127.0.0.1\";\n server.listen(port, host, () => {\n resetInactivityTimer();\n resolve({\n server,\n port,\n url: `http://${host === \"0.0.0.0\" ? \"localhost\" : host}:${port}`,\n shutdown,\n });\n });\n });\n}\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, readdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { info, error, header } from \"../utils/display.js\";\n\nexport const boardCommand = new Command(\"board\")\n .description(\"Launch the BeastMode Board web UI\")\n .option(\"--port <number>\", \"Port to serve on\", \"7669\")\n .option(\"--host <host>\", \"Host to bind to (use 0.0.0.0 for external access)\", \"127.0.0.1\")\n .action(async (opts) => {\n try {\n await runBoard(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nboardCommand\n .command(\"set-status <item_id> <status>\")\n .description(\n \"Safely change a board item's status via the board HTTP API (never sqlite3 against the live DB — Gap 24)\",\n )\n .option(\"--project <name>\", \"Project/board name (defaults to the factory's only project, or errors if ambiguous)\")\n .option(\"--board-url <url>\", \"Override board HTTP URL (default: use running board container via docker exec)\")\n .action(async (itemId: string, status: string, opts: { project?: string; boardUrl?: string }) => {\n try {\n await setItemStatus(itemId, status, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface BoardOptions {\n port: string;\n host: string;\n}\n\n/**\n * Walk up from cwd to find the nearest .beastmode/ directory.\n * Returns the factory directory path or null if not found.\n */\nexport function findFactoryDir(startDir?: string): string | null {\n let dir = startDir || process.cwd();\n const root = resolve(\"/\");\n\n while (dir !== root) {\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n\n // Check root too\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n\n return null;\n}\n\nfunction inferProjectName(factoryDir: string): string | null {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return null;\n const files = readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"));\n if (files.length === 1) return files[0].replace(/\\.json$/, \"\");\n return null;\n}\n\nfunction tryExecSync(cmd: string, timeoutMs = 15000): string | null {\n try {\n return execSync(cmd, { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"pipe\"], timeout: timeoutMs }).trim();\n } catch {\n return null;\n }\n}\n\nexport async function setItemStatus(\n itemId: string,\n status: string,\n opts: { project?: string; boardUrl?: string },\n): Promise<void> {\n if (!itemId || !/^\\d+$/.test(itemId)) {\n throw new Error(`Invalid item_id: ${itemId} (expected numeric id)`);\n }\n const trimmedStatus = status.trim();\n if (!trimmedStatus) {\n throw new Error(\"status cannot be empty\");\n }\n if (trimmedStatus === \"Superseded\") {\n throw new Error(\n \"Use `beastmode supersede <item-id>` to mark items as Superseded. \" +\n \"That command collects required metadata (successor ID and reason for epics) \" +\n \"and provides a confirmation step.\",\n );\n }\n\n let project = opts.project;\n if (!project) {\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\"No .beastmode factory found in cwd tree. Pass --project <name> explicitly.\");\n }\n const inferred = inferProjectName(factoryDir);\n if (!inferred) {\n throw new Error(\n \"Could not determine project name from factory (0 or >1 projects configured). Pass --project <name>.\",\n );\n }\n project = inferred;\n }\n\n const payload = JSON.stringify({ status: trimmedStatus });\n\n if (opts.boardUrl) {\n const url = `${opts.boardUrl.replace(/\\/+$/, \"\")}/api/items/${itemId}?board=${encodeURIComponent(project)}`;\n const cmd = `curl -sS -X PATCH '${url}' -H 'Content-Type: application/json' -d '${payload.replace(/'/g, \"'\\\\''\")}'`;\n const out = tryExecSync(cmd);\n if (!out) throw new Error(`curl failed hitting ${url}`);\n info(out);\n return;\n }\n\n // Prefer the daemon container — it has curl AND is on the same docker\n // network as the board. The board container itself only ships python3,\n // no curl/wget, so we can't exec curl there directly.\n const container =\n tryExecSync(`docker ps --filter 'label=com.docker.compose.service=daemon' --format '{{.Names}}' | head -n1`) ||\n tryExecSync(`docker ps --filter 'label=com.docker.compose.service=ui' --format '{{.Names}}' | head -n1`);\n if (!container) {\n throw new Error(\n \"No running daemon or ui container found. Start the factory with `docker compose up -d`, or pass --board-url.\",\n );\n }\n\n const escapedPayload = payload.replace(/'/g, \"'\\\\''\");\n const url = `http://board:8080/api/items/${itemId}?board=${encodeURIComponent(project)}`;\n const cmd = `docker exec ${container} curl -sS -X PATCH '${url}' -H 'Content-Type: application/json' -d '${escapedPayload}'`;\n const out = tryExecSync(cmd);\n if (!out) {\n throw new Error(`docker exec curl failed hitting ${url} via ${container}`);\n }\n\n // Board returns 200 + ItemResponse on success, 404/400 with {\"detail\": \"...\"} on failure.\n try {\n const parsed = JSON.parse(out) as { detail?: string; id?: string; status?: string };\n if (parsed.detail) {\n throw new Error(`Board rejected update: ${parsed.detail}`);\n }\n if (parsed.id && parsed.status) {\n info(`Item ${parsed.id} → ${parsed.status} (project=${project})`);\n return;\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith(\"Board rejected update:\")) throw e;\n }\n info(out);\n}\n\nasync function runBoard(opts: BoardOptions): Promise<void> {\n let factoryDir = findFactoryDir();\n if (!factoryDir) {\n // Auto-create a stub factory in cwd so the board works out-of-the-box\n // (primarily for Docker Compose and ad-hoc usage). Users can run\n // `beastmode init` later for a fully-configured factory.\n factoryDir = process.cwd();\n const bmDir = join(factoryDir, \".beastmode\");\n if (!existsSync(bmDir)) {\n mkdirSync(bmDir, { recursive: true });\n }\n const factoryJsonPath = join(bmDir, \"factory.json\");\n if (!existsSync(factoryJsonPath)) {\n writeFileSync(\n factoryJsonPath,\n JSON.stringify({ factory_name: \"BeastMode\", created_at: new Date().toISOString() }, null, 2),\n \"utf-8\"\n );\n info(\"No factory found — created minimal stub at .beastmode/factory.json\");\n }\n }\n\n // Read factory name\n const factoryJsonPath = join(factoryDir, \".beastmode\", \"factory.json\");\n const factoryJson = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const factoryName = factoryJson.factory_name || \"BeastMode Factory\";\n\n header(`BeastMode Board — ${factoryName}`);\n\n const { startServer } = await import(\"../ui/server.js\");\n const port = parseInt(opts.port, 10) || 7669;\n\n const uiServer = await startServer({\n port,\n host: opts.host,\n factoryName,\n factoryPath: factoryDir,\n mode: \"board\",\n });\n\n info(`Board running at ${uiServer.url}/board`);\n info(\"Press Ctrl+C to stop.\\n\");\n\n // Open browser (skip in Docker / CI — no display)\n const skipOpen = process.env.BEASTMODE_NO_OPEN === \"1\" || !!process.env.DOCKER_CONTAINER;\n if (!skipOpen) {\n try {\n const open = (await import(\"open\")).default;\n await open(`${uiServer.url}/board`);\n } catch {\n info(`Open ${uiServer.url}/board in your browser.`);\n }\n } else {\n info(`Open ${uiServer.url}/board in your browser.`);\n }\n\n // Keep process alive until shutdown\n await new Promise<void>((resolvePromise) => {\n uiServer.server.on(\"close\", resolvePromise);\n process.on(\"SIGINT\", async () => {\n info(\"\\nShutting down board server...\");\n await uiServer.shutdown();\n resolvePromise();\n });\n });\n}\n","import { Command } from \"commander\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { writeFileSync, readFileSync, chmodSync, mkdirSync, existsSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport { homedir, platform } from \"os\";\nimport { header, success, warn, info, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\n\ninterface SyncOptions {\n restart?: boolean;\n install?: boolean;\n uninstall?: boolean;\n status?: boolean;\n interval?: string;\n}\n\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\nconst SYSTEMD_UNIT_NAME = \"beastmode-claude-creds\";\nconst DEFAULT_INTERVAL_SECONDS = 1800; // 30 minutes\n\nfunction systemdUserDir(): string {\n return join(homedir(), \".config\", \"systemd\", \"user\");\n}\n\nfunction systemdServicePath(): string {\n return join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.service`);\n}\n\nfunction systemdTimerPath(): string {\n return join(systemdUserDir(), `${SYSTEMD_UNIT_NAME}.timer`);\n}\n\nfunction linuxCredsPath(): string {\n return join(homedir(), \".claude\", \".credentials.json\");\n}\n\nfunction plistPath(): string {\n return join(homedir(), \"Library\", \"LaunchAgents\", `${LAUNCH_AGENT_LABEL}.plist`);\n}\n\nfunction agentLogPath(): string {\n return join(homedir(), \".beastmode\", \"logs\", \"sync-claude-creds.log\");\n}\n\n/** Read Claude Code OAuth token from macOS Keychain.\n *\n * Returns ``null`` instead of exiting when the token is missing, so\n * callers (like ``beastmode init``) can decide whether the miss is\n * fatal or a best-effort warning. The CLI ``sync-claude-creds``\n * entry still treats a miss as fatal via ``readKeychainTokenOrExit``.\n */\nexport function readKeychainTokenSafe(): string | null {\n try {\n return execSync(\n `security find-generic-password -s \"Claude Code-credentials\" -w`,\n { encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }\n ).trim();\n } catch {\n return null;\n }\n}\n\nfunction readKeychainToken(): string {\n const token = readKeychainTokenSafe();\n if (token === null) {\n error(\"Could not read Claude Code credentials from Keychain.\");\n info(\"Fix: run `claude login` first, then re-run this command.\");\n process.exit(1);\n }\n return token;\n}\n\n/** Write token JSON to ~/.claude/.credentials.json (mode 0600).\n *\n * Throws ``Error`` on validation failure instead of ``process.exit``\n * so library callers (``beastmode init`` → ``syncClaudeCredsOnce``)\n * can surface the problem as a warning without terminating. The CLI\n * entry catches those throws in ``runSyncClaudeCreds``.\n */\nfunction writeCredentialsFile(rawJson: string): string {\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawJson);\n } catch {\n throw new Error(\"Keychain entry is not valid JSON. Fix: run `claude login` again to reset the credential.\");\n }\n\n const oauth = (parsed as { claudeAiOauth?: { accessToken?: string; expiresAt?: number } })\n .claudeAiOauth;\n if (!oauth?.accessToken) {\n throw new Error(\"Keychain entry missing claudeAiOauth.accessToken. Fix: run `claude login` again to reset the credential.\");\n }\n\n const claudeDir = join(homedir(), \".claude\");\n if (!existsSync(claudeDir)) mkdirSync(claudeDir, { recursive: true });\n const credsPath = join(claudeDir, \".credentials.json\");\n writeFileSync(credsPath, rawJson + \"\\n\", \"utf-8\");\n chmodSync(credsPath, 0o600);\n\n // Token expiry diagnostic\n if (oauth.expiresAt) {\n const hoursLeft = Math.round((oauth.expiresAt - Date.now()) / 3_600_000);\n if (hoursLeft < 0) {\n warn(`Token already expired ${Math.abs(hoursLeft)}h ago — run \\`claude login\\` to refresh.`);\n } else if (hoursLeft < 2) {\n warn(`Token expires in ${hoursLeft}h — background agent will re-sync after host refreshes it.`);\n }\n }\n return credsPath;\n}\n\n/** Path to the urgency marker file the daemon's broker creates when\n * it wants the host to sync credentials NOW (without waiting for the\n * next interval tick). The launchd plist watches this path via\n * ``WatchPaths`` so a `touch` from inside the container fires the\n * sync within ~2-5 seconds. */\nfunction urgencyMarkerHostPath(factoryDir: string): string {\n return join(factoryDir, \"daemon\", \"logs\", \".cred-refresh-needed\");\n}\n\n/** Remove the urgency marker after a successful sync.\n *\n * Best-effort: if the file is missing (the common case on a normal\n * scheduled tick) this is a no-op. ENOENT and other errors are\n * swallowed because failing here would mask the success of the sync\n * itself. */\nfunction removeUrgencyMarker(factoryDir: string | undefined): void {\n if (!factoryDir) return;\n const markerPath = urgencyMarkerHostPath(factoryDir);\n try {\n unlinkSync(markerPath);\n } catch {\n // marker not present — fine, this is the normal interval-tick case\n }\n}\n\n/** Build the launchd plist XML. Uses the current node binary and CLI entry.\n *\n * When ``factoryDir`` is provided, the plist gains a ``WatchPaths`` entry\n * pointing at the daemon's urgency-marker file. launchd then fires the\n * agent as soon as the daemon's broker creates that file (instead of\n * waiting for the next ``StartInterval`` tick), collapsing the\n * worst-case credential-refresh wait from ~30 minutes to ~5 seconds.\n *\n * When ``factoryDir`` is omitted, the plist falls back to interval-only\n * behavior — backward compatible with installs that pre-date this\n * feature. */\nfunction buildPlist(intervalSeconds: number, factoryDir?: string): string {\n const nodePath = process.execPath;\n const cliEntry = process.argv[1]; // path to the running cli (dist/index.js or similar)\n const logPath = agentLogPath();\n const keychainPath = join(homedir(), \"Library\", \"Keychains\", \"login.keychain-db\");\n\n const watchPaths: string[] = [keychainPath];\n if (factoryDir) {\n watchPaths.push(urgencyMarkerHostPath(factoryDir));\n }\n const watchPathsXml = ` <key>WatchPaths</key>\n <array>\n${watchPaths.map((p) => ` <string>${p}</string>`).join(\"\\n\")}\n </array>\n`;\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LAUNCH_AGENT_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${nodePath}</string>\n <string>${cliEntry}</string>\n <string>sync-claude-creds</string>\n </array>\n <key>StartInterval</key>\n <integer>${intervalSeconds}</integer>\n <key>RunAtLoad</key>\n <true/>\n${watchPathsXml} <key>StandardOutPath</key>\n <string>${logPath}</string>\n <key>StandardErrorPath</key>\n <string>${logPath}</string>\n</dict>\n</plist>\n`;\n}\n\n/** Install the credential-sync LaunchAgent.\n *\n * ``throwOnError`` flips the failure behavior:\n * - CLI entry (``sync-claude-creds --install``) passes ``false`` and\n * treats launchctl errors as a hard ``process.exit(1)``.\n * - ``beastmode init`` passes ``true`` so a flaky install (e.g. user\n * declined the launchd prompt) becomes a warning instead of a\n * blown-up scaffold.\n */\nexport function installAgent(\n intervalSeconds: number,\n {\n throwOnError = false,\n factoryDir,\n }: { throwOnError?: boolean; factoryDir?: string } = {},\n): void {\n const plist = plistPath();\n const logPath = agentLogPath();\n\n mkdirSync(join(homedir(), \"Library\", \"LaunchAgents\"), { recursive: true });\n mkdirSync(join(homedir(), \".beastmode\", \"logs\"), { recursive: true });\n\n // Unload existing agent if present (idempotent reinstall)\n const uid = process.getuid?.();\n if (existsSync(plist)) {\n spawnSync(\"launchctl\", [\"bootout\", `gui/${uid}`, plist], { stdio: \"pipe\" });\n }\n\n // Resolve factory dir for WatchPaths if the caller didn't pass one\n // explicitly. When run from a beastmode factory directory this finds\n // the root via the .beastmode marker; when run elsewhere we fall\n // back to interval-only behavior.\n const resolvedFactory = factoryDir ?? findFactoryDir() ?? undefined;\n writeFileSync(plist, buildPlist(intervalSeconds, resolvedFactory), \"utf-8\");\n // Touch log so StandardOutPath exists immediately (launchd is picky)\n writeFileSync(logPath, \"\", { flag: \"a\" });\n\n const result = spawnSync(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plist], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n if (result.status !== 0) {\n const msg = `launchctl bootstrap failed: ${result.stderr || result.stdout}`;\n if (throwOnError) {\n throw new Error(msg);\n }\n error(msg);\n info(`Plist written to: ${plist}`);\n info(`Try manually: launchctl bootstrap gui/${uid} ${plist}`);\n process.exit(1);\n }\n\n success(`LaunchAgent installed: ${LAUNCH_AGENT_LABEL}`);\n info(` Plist: ${plist}`);\n info(` Interval: every ${Math.round(intervalSeconds / 60)} minutes`);\n info(` Logs: ${logPath}`);\n info(` Triggers: load + every ${Math.round(intervalSeconds / 60)}min + Keychain change`);\n console.log();\n info(\"The agent also runs once right now (RunAtLoad=true) — credentials synced.\");\n}\n\n/** Export the writer so callers outside this module can persist a\n * fresh Keychain token on demand. Used by ``beastmode init`` to seed\n * ``~/.claude/.credentials.json`` at scaffold time so the first\n * ``docker compose up`` doesn't crash on \"Claude CLI Not Logged In\".\n */\nexport function syncClaudeCredsOnce(): { path: string } | { error: string } {\n const token = readKeychainTokenSafe();\n if (token === null) {\n return { error: \"Could not read Claude Code credentials from Keychain — run `claude login` first.\" };\n }\n try {\n const path = writeCredentialsFile(token);\n return { path };\n } catch (e) {\n return { error: `Failed to write credentials: ${e instanceof Error ? e.message : String(e)}` };\n }\n}\n\nfunction uninstallAgent(): void {\n const plist = plistPath();\n const uid = process.getuid?.();\n\n if (!existsSync(plist)) {\n info(\"No LaunchAgent installed — nothing to remove.\");\n return;\n }\n\n const result = spawnSync(\"launchctl\", [\"bootout\", `gui/${uid}`, plist], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n\n // bootout returns non-zero if not loaded, but that's fine — we're removing it anyway\n if (result.status !== 0 && !(result.stderr || \"\").includes(\"Could not find\")) {\n warn(`launchctl bootout returned: ${result.stderr || result.stdout}`);\n }\n\n try {\n unlinkSync(plist);\n } catch {\n // already gone\n }\n\n success(`LaunchAgent removed: ${LAUNCH_AGENT_LABEL}`);\n}\n\nfunction showStatus(): void {\n const plist = plistPath();\n const uid = process.getuid?.();\n\n if (!existsSync(plist)) {\n info(\"LaunchAgent not installed.\");\n info(\"Install with: beastmode sync-claude-creds --install\");\n return;\n }\n\n const result = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" }\n );\n\n if (result.status === 0) {\n success(`LaunchAgent loaded: ${LAUNCH_AGENT_LABEL}`);\n // Extract the important bits\n const stateMatch = result.stdout.match(/state = (\\S+)/);\n const lastExitMatch = result.stdout.match(/last exit code = (\\S+)/);\n if (stateMatch) info(` State: ${stateMatch[1]}`);\n if (lastExitMatch) info(` Last exit code: ${lastExitMatch[1]}`);\n info(` Plist: ${plist}`);\n info(` Logs: ${agentLogPath()}`);\n } else {\n warn(`Plist exists but agent not loaded. Re-install with: beastmode sync-claude-creds --install`);\n }\n}\n\n// ── Linux support ────────────────────────────────────────────────────\n//\n// On Linux, the Claude CLI writes credentials directly to\n// ~/.claude/.credentials.json — no Keychain extraction needed. The\n// Linux sync command becomes a *validator + refresh trigger*:\n// - Read the credentials file\n// - Validate JSON shape (claudeAiOauth.accessToken)\n// - If the token is within 60 minutes of expiry, run\n// ``claude --print ping`` to nudge the CLI's refresh-token flow\n// - Re-read after the refresh attempt\n//\n// The watcher install/uninstall/status path is a systemd user timer\n// instead of a launchd agent.\n\ninterface LinuxCredsParsed {\n claudeAiOauth?: {\n accessToken?: string;\n expiresAt?: number;\n };\n}\n\n/** Validate the Linux credentials file and trigger a CLI refresh if\n * the token is close to expiry. Returns ``{ path }`` on success or\n * ``{ error }`` if the file is missing/malformed. Used by both the\n * one-shot Linux ``sync-claude-creds`` command and ``beastmode init``.\n */\nexport function syncClaudeCredsLinux(): { path: string } | { error: string } {\n const credsPath = linuxCredsPath();\n if (!existsSync(credsPath)) {\n return {\n error: `${credsPath} not found — run \\`claude login\\` first`,\n };\n }\n\n let parsed: LinuxCredsParsed;\n try {\n const raw = readFileSync(credsPath, \"utf-8\");\n parsed = JSON.parse(raw) as LinuxCredsParsed;\n } catch {\n return {\n error: `${credsPath} exists but is not valid JSON — run \\`claude login\\` to reset`,\n };\n }\n\n const oauth = parsed.claudeAiOauth;\n if (!oauth?.accessToken) {\n return {\n error: `${credsPath} missing claudeAiOauth.accessToken — run \\`claude login\\``,\n };\n }\n\n if (oauth.expiresAt) {\n const minutesLeft = (oauth.expiresAt - Date.now()) / 60_000;\n if (minutesLeft < 60) {\n info(\n `Token expiring in ${Math.round(minutesLeft)}min — triggering refresh via \\`claude --print ping\\`...`,\n );\n const result = spawnSync(\"claude\", [\"--print\", \"ping\"], {\n stdio: \"pipe\",\n timeout: 15000,\n });\n if (result.status !== 0) {\n warn(\n `claude --print ping failed (exit ${result.status ?? \"?\"}) — token may still be valid`,\n );\n }\n try {\n const raw2 = readFileSync(credsPath, \"utf-8\");\n const parsed2 = JSON.parse(raw2) as LinuxCredsParsed;\n if (parsed2.claudeAiOauth?.expiresAt) {\n const newMinutes =\n (parsed2.claudeAiOauth.expiresAt - Date.now()) / 60_000;\n info(`Token now valid for ${Math.round(newMinutes)} more minutes`);\n }\n } catch {\n // ignore re-read failure — best-effort logging\n }\n }\n }\n\n return { path: credsPath };\n}\n\nfunction buildServiceUnit(\n nodePath: string,\n cliEntry: string,\n logPath: string,\n): string {\n return `[Unit]\nDescription=BeastMode Claude credential sync\n\n[Service]\nType=oneshot\nExecStart=${nodePath} ${cliEntry} sync-claude-creds\nStandardOutput=append:${logPath}\nStandardError=append:${logPath}\n`;\n}\n\nfunction buildTimerUnit(intervalSeconds: number): string {\n return `[Unit]\nDescription=BeastMode Claude credential sync timer\n\n[Timer]\nOnBootSec=30s\nOnUnitActiveSec=${intervalSeconds}s\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n`;\n}\n\nfunction ensureSystemctlAvailable(): string | null {\n const result = spawnSync(\"systemctl\", [\"--version\"], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (result.status !== 0) {\n return \"systemctl not available — systemd user units not supported on this system\";\n }\n return null;\n}\n\n/** Install the credential-sync systemd user timer.\n *\n * ``throwOnError`` flips the failure behavior:\n * - CLI entry (``sync-claude-creds --install``) passes ``false`` and\n * treats systemctl errors as a hard ``process.exit(1)``.\n * - ``beastmode init`` passes ``true`` so a flaky install becomes a\n * warning instead of a blown-up scaffold.\n */\nexport function installAgentLinux(\n intervalSeconds: number,\n { throwOnError = false }: { throwOnError?: boolean } = {},\n): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n if (throwOnError) throw new Error(unavail);\n error(unavail);\n process.exit(1);\n }\n\n const unitDir = systemdUserDir();\n const logDir = join(homedir(), \".beastmode\", \"logs\");\n mkdirSync(unitDir, { recursive: true });\n mkdirSync(logDir, { recursive: true });\n\n const logPath = join(logDir, \"sync-claude-creds.log\");\n const nodePath = process.execPath;\n const cliEntry = process.argv[1];\n\n writeFileSync(\n systemdServicePath(),\n buildServiceUnit(nodePath, cliEntry, logPath),\n \"utf-8\",\n );\n writeFileSync(\n systemdTimerPath(),\n buildTimerUnit(intervalSeconds),\n \"utf-8\",\n );\n\n const reload = spawnSync(\"systemctl\", [\"--user\", \"daemon-reload\"], {\n stdio: \"pipe\",\n encoding: \"utf-8\",\n });\n if (reload.status !== 0) {\n const msg = `systemctl --user daemon-reload failed: ${reload.stderr || reload.stdout}`;\n if (throwOnError) throw new Error(msg);\n error(msg);\n process.exit(1);\n }\n\n const enable = spawnSync(\n \"systemctl\",\n [\"--user\", \"enable\", \"--now\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (enable.status !== 0) {\n const msg = `systemctl --user enable --now failed: ${enable.stderr || enable.stdout}`;\n if (throwOnError) throw new Error(msg);\n error(msg);\n info(`Service: ${systemdServicePath()}`);\n info(`Timer: ${systemdTimerPath()}`);\n process.exit(1);\n }\n\n success(`Systemd timer installed: ${SYSTEMD_UNIT_NAME}.timer`);\n info(` Service: ${systemdServicePath()}`);\n info(` Timer: ${systemdTimerPath()}`);\n info(` Interval: every ${Math.round(intervalSeconds / 60)} minutes`);\n info(` Logs: ${logPath}`);\n}\n\nfunction uninstallAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n process.exit(1);\n }\n\n spawnSync(\"systemctl\", [\"--user\", \"stop\", `${SYSTEMD_UNIT_NAME}.timer`], {\n stdio: \"pipe\",\n });\n spawnSync(\n \"systemctl\",\n [\"--user\", \"disable\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\" },\n );\n\n const servicePath = systemdServicePath();\n const timerPath = systemdTimerPath();\n let removed = false;\n if (existsSync(servicePath)) {\n try {\n unlinkSync(servicePath);\n removed = true;\n } catch {\n // already gone\n }\n }\n if (existsSync(timerPath)) {\n try {\n unlinkSync(timerPath);\n removed = true;\n } catch {\n // already gone\n }\n }\n\n spawnSync(\"systemctl\", [\"--user\", \"daemon-reload\"], { stdio: \"pipe\" });\n\n if (removed) {\n success(`Systemd timer uninstalled: ${SYSTEMD_UNIT_NAME}.timer`);\n } else {\n info(\"No systemd unit files found — nothing to remove.\");\n }\n}\n\nfunction statusAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n return;\n }\n\n if (!existsSync(systemdTimerPath())) {\n info(\"Systemd timer not installed.\");\n info(\"Install with: beastmode sync-claude-creds --install\");\n return;\n }\n\n const isActive = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n const active = (isActive.stdout || \"\").trim();\n\n if (active === \"active\") {\n success(`Systemd timer active: ${SYSTEMD_UNIT_NAME}.timer`);\n } else {\n warn(`Systemd timer not active (state: ${active || \"unknown\"})`);\n }\n\n const show = spawnSync(\n \"systemctl\",\n [\n \"--user\",\n \"show\",\n `${SYSTEMD_UNIT_NAME}.service`,\n \"--property=ExecMainStartTimestamp,ExecMainStatus\",\n ],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (show.status === 0 && show.stdout) {\n for (const line of show.stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed) info(` ${trimmed}`);\n }\n }\n info(` Service: ${systemdServicePath()}`);\n info(` Timer: ${systemdTimerPath()}`);\n}\n\nfunction restartAgentLinux(): void {\n const unavail = ensureSystemctlAvailable();\n if (unavail) {\n error(unavail);\n process.exit(1);\n }\n const result = spawnSync(\n \"systemctl\",\n [\"--user\", \"restart\", `${SYSTEMD_UNIT_NAME}.timer`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (result.status !== 0) {\n error(\n `systemctl --user restart failed: ${result.stderr || result.stdout}`,\n );\n process.exit(1);\n }\n success(`Restarted: ${SYSTEMD_UNIT_NAME}.timer`);\n}\n\nexport const syncClaudeCredsCommand = new Command(\"sync-claude-creds\")\n .description(\n \"Sync/validate Claude credentials for Docker (macOS: extract from Keychain; Linux: validate ~/.claude/.credentials.json + refresh)\"\n )\n .option(\"--restart\", \"Restart the daemon container after syncing (one-shot only)\")\n .option(\"--install\", \"Install a watcher (launchd on macOS, systemd user timer on Linux) that re-syncs periodically\")\n .option(\"--uninstall\", \"Remove the watcher\")\n .option(\"--status\", \"Show watcher status\")\n .option(\"--interval <seconds>\", \"Sync interval for --install (default: 1800)\", \"1800\")\n .action(async (opts: SyncOptions) => {\n const plat = platform();\n\n if (plat !== \"darwin\" && plat !== \"linux\") {\n error(`Unsupported platform: ${plat}`);\n info(\"Supported: macOS (darwin), Linux\");\n process.exit(1);\n }\n\n if (opts.install) {\n header(\"Install Claude Credential Sync Agent\");\n console.log();\n const seconds = parseInt(opts.interval || \"1800\", 10);\n if (isNaN(seconds) || seconds < 60) {\n error(`Invalid --interval: ${opts.interval} (minimum 60 seconds)`);\n process.exit(1);\n }\n if (plat === \"darwin\") {\n installAgent(seconds);\n } else {\n installAgentLinux(seconds);\n }\n return;\n }\n\n if (opts.uninstall) {\n header(\"Remove Claude Credential Sync Agent\");\n console.log();\n if (plat === \"darwin\") {\n uninstallAgent();\n } else {\n uninstallAgentLinux();\n }\n return;\n }\n\n if (opts.status) {\n header(\"Claude Credential Sync Agent Status\");\n console.log();\n if (plat === \"darwin\") {\n showStatus();\n } else {\n statusAgentLinux();\n }\n return;\n }\n\n if (opts.restart && plat === \"linux\") {\n header(\"Restart Claude Credential Sync Timer\");\n console.log();\n restartAgentLinux();\n return;\n }\n\n if (plat === \"darwin\") {\n header(\"Sync Claude Code Credentials\");\n console.log();\n const rawJson = readKeychainToken();\n let credsPath: string;\n try {\n credsPath = writeCredentialsFile(rawJson);\n } catch (e) {\n error(e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n success(`Wrote ${credsPath}`);\n\n // Clear the daemon's urgency marker so the broker stops\n // waiting and the next launchd interval tick doesn't re-trigger\n // a redundant sync.\n removeUrgencyMarker(findFactoryDir() ?? undefined);\n\n if (opts.restart) {\n console.log();\n info(\"Restarting daemon container...\");\n const result = spawnSync(\"docker\", [\"compose\", \"restart\", \"daemon\"], { stdio: \"inherit\" });\n if (result.status !== 0) {\n warn(\"docker compose restart daemon failed — run it manually.\");\n process.exit(result.status ?? 1);\n }\n success(\"Daemon restarted.\");\n } else {\n console.log();\n info(\"Automate: beastmode sync-claude-creds --install\");\n }\n return;\n }\n\n // Linux one-shot: validate file and trigger refresh if expiring.\n header(\"Validate Claude Credentials\");\n console.log();\n const result = syncClaudeCredsLinux();\n if (\"error\" in result) {\n error(result.error);\n process.exit(1);\n }\n success(`Credentials valid: ${result.path}`);\n\n // Clear the daemon's urgency marker (same rationale as macOS path).\n removeUrgencyMarker(findFactoryDir() ?? undefined);\n\n console.log();\n info(\"Automate: beastmode sync-claude-creds --install\");\n });\n","/**\n * BeastMode MCP Server — exposes factory operations as MCP tools.\n * Uses @modelcontextprotocol/sdk with stdio transport.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { z } from \"zod\";\nimport { readFileSync, writeFileSync, existsSync, readdirSync, mkdirSync } from \"fs\";\nimport { join, resolve, basename } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport {\n collectStatus,\n configGet,\n configSet,\n coerceValue,\n generateDefaults,\n installPlugin,\n removePlugin,\n listMcps,\n listHooks,\n listSkills,\n detectStack,\n ENGINE_VERSION,\n} from \"../engine/index.js\";\nimport { FactoryIdentitySchema } from \"../engine/schemas.js\";\nimport type { StatusInput } from \"../engine/index.js\";\n\n// ── Helpers ──\n\nfunction readJsonFile(filePath: string): unknown {\n if (!existsSync(filePath)) return null;\n try {\n return JSON.parse(readFileSync(filePath, \"utf-8\"));\n } catch {\n return null;\n }\n}\n\nfunction getFactoryPath(): string {\n const envPath = process.env.BEASTMODE_FACTORY_PATH;\n if (envPath && existsSync(join(envPath, \".beastmode\", \"factory.json\"))) {\n return envPath;\n }\n // Walk up from cwd\n let dir = process.cwd();\n const root = resolve(\"/\");\n while (dir !== root) {\n if (existsSync(join(dir, \".beastmode\", \"factory.json\"))) {\n return dir;\n }\n const parent = resolve(dir, \"..\");\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\n \"No BeastMode factory found. Set BEASTMODE_FACTORY_PATH or run from a factory directory.\"\n );\n}\n\nfunction readFactoryStatus(factoryDir: string): ReturnType<typeof collectStatus> {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryIdentity = FactoryIdentitySchema.parse(\n JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"))\n );\n\n const projectsDir = join(bmDir, \"projects\");\n const projectCount = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\")).length\n : 0;\n\n const lockPath = join(bmDir, \"extensions.lock\");\n let pluginNames: string[] = [];\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n pluginNames = Object.keys(lock.plugins || {});\n } catch { /* empty */ }\n }\n\n let mcpServers: Record<string, unknown> = {};\n try { mcpServers = listMcps(factoryDir); } catch { /* empty */ }\n\n let hooks: Record<string, unknown[]> = {};\n try { hooks = listHooks(factoryDir); } catch { /* empty */ }\n\n let skillCount = 0;\n try { skillCount = listSkills(factoryDir).length; } catch { /* empty */ }\n\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => {\n try { return readdirSync(join(runsDir, d)).length > 0; } catch { return false; }\n })\n .sort();\n }\n\n const pidFile = join(bmDir, \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidFile)) {\n try {\n daemonPid = parseInt(readFileSync(pidFile, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch { pidAlive = false; }\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n };\n\n return collectStatus(input);\n}\n\ninterface BoardItem {\n id: string;\n title: string;\n description: string;\n status: string;\n created_at: string;\n updated_at: string;\n}\n\nfunction readBoardItems(factoryDir: string): BoardItem[] {\n const filePath = join(factoryDir, \".beastmode\", \"board.json\");\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\"));\n return Array.isArray(raw.items) ? raw.items : [];\n } catch { return []; }\n}\n\nfunction writeBoardItems(factoryDir: string, items: BoardItem[]): void {\n const filePath = join(factoryDir, \".beastmode\", \"board.json\");\n writeFileSync(filePath, JSON.stringify({ items }, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── MCP Server Creation ──\n\nexport function createMcpServer(): McpServer {\n const server = new McpServer(\n { name: \"beastmode\", version: ENGINE_VERSION },\n { capabilities: { tools: {} } }\n );\n\n // ── Tool: factory_status ──\n server.tool(\n \"factory_status\",\n \"Get factory status overview including projects, plugins, runs, and daemon state\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const status = readFactoryStatus(factoryDir);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(status, null, 2) }] };\n }\n );\n\n // ── Tool: factory_config_get ──\n server.tool(\n \"factory_config_get\",\n \"Read a config value by dot-notation key path (e.g. 'pipeline.satisfaction_threshold')\",\n { key_path: z.string().describe(\"Dot-notation key path\") },\n async ({ key_path }) => {\n const factoryDir = getFactoryPath();\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const config = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n try {\n const value = configGet(config, key_path);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(value, null, 2) }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: factory_config_set ──\n server.tool(\n \"factory_config_set\",\n \"Set a config value by dot-notation key path\",\n {\n key_path: z.string().describe(\"Dot-notation key path\"),\n value: z.string().describe(\"Value to set (auto-coerced: true/false/numbers/null)\"),\n },\n async ({ key_path, value }) => {\n const factoryDir = getFactoryPath();\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n const config = existsSync(configPath)\n ? JSON.parse(readFileSync(configPath, \"utf-8\"))\n : generateDefaults();\n const coerced = coerceValue(value);\n const updated = configSet(config, key_path, coerced);\n writeFileSync(configPath, JSON.stringify(updated, null, 2) + \"\\n\", \"utf-8\");\n return { content: [{ type: \"text\" as const, text: `Set ${key_path} = ${JSON.stringify(coerced)}` }] };\n }\n );\n\n // ── Tool: pipeline_run ──\n server.tool(\n \"pipeline_run\",\n \"Create a task on the board to trigger a pipeline run\",\n {\n title: z.string().describe(\"Task title/description\"),\n status: z.string().optional().describe(\"Initial status (default: ready)\"),\n },\n async ({ title, status }) => {\n const factoryDir = getFactoryPath();\n const now = new Date().toISOString();\n const item: BoardItem = {\n id: randomUUID(),\n title,\n description: \"\",\n status: status || \"ready\",\n created_at: now,\n updated_at: now,\n };\n const items = readBoardItems(factoryDir);\n items.push(item);\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n // ── Tool: pipeline_status ──\n server.tool(\n \"pipeline_status\",\n \"Get active run checkpoint information\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const runsDir = join(factoryDir, \"runs\");\n if (!existsSync(runsDir)) {\n return { content: [{ type: \"text\" as const, text: \"No runs directory found.\" }] };\n }\n const runDirs = readdirSync(runsDir).sort().reverse();\n const activeRuns: Array<{ id: string; checkpoint: unknown }> = [];\n for (const id of runDirs.slice(0, 10)) {\n const cp = readJsonFile(join(runsDir, id, \"checkpoint.json\"));\n if (cp) {\n activeRuns.push({ id, checkpoint: cp });\n }\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify(activeRuns, null, 2) }] };\n }\n );\n\n // ── Tool: run_detail ──\n server.tool(\n \"run_detail\",\n \"Get detailed run information including manifest, iterations, and satisfaction\",\n { run_id: z.string().describe(\"Run ID (directory name)\") },\n async ({ run_id }) => {\n const factoryDir = getFactoryPath();\n const runDir = join(factoryDir, \"runs\", run_id);\n if (!existsSync(runDir)) {\n return { content: [{ type: \"text\" as const, text: `Run not found: ${run_id}` }], isError: true };\n }\n const manifest = readJsonFile(join(runDir, \"manifest.json\"));\n const checkpoint = readJsonFile(join(runDir, \"checkpoint.json\"));\n const iterationsDir = join(runDir, \"iterations\");\n const iterations: Array<{ number: number; satisfaction: unknown }> = [];\n if (existsSync(iterationsDir)) {\n for (const dir of readdirSync(iterationsDir).sort()) {\n const satisfaction = readJsonFile(join(iterationsDir, dir, \"satisfaction.json\"));\n iterations.push({ number: parseInt(dir, 10), satisfaction });\n }\n }\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ id: run_id, manifest, checkpoint, iterations }, null, 2),\n }],\n };\n }\n );\n\n // ── Tool: plugin_install ──\n server.tool(\n \"plugin_install\",\n \"Install a plugin from source (path, git URL, or registry name)\",\n { source: z.string().describe(\"Plugin source\") },\n async ({ source }) => {\n const factoryDir = getFactoryPath();\n try {\n await installPlugin(factoryDir, source);\n return { content: [{ type: \"text\" as const, text: `Plugin installed: ${source}` }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: plugin_remove ──\n server.tool(\n \"plugin_remove\",\n \"Remove an installed plugin by name\",\n { name: z.string().describe(\"Plugin name\") },\n async ({ name }) => {\n const factoryDir = getFactoryPath();\n try {\n removePlugin(factoryDir, name);\n return { content: [{ type: \"text\" as const, text: `Plugin removed: ${name}` }] };\n } catch (err) {\n return { content: [{ type: \"text\" as const, text: `Error: ${(err as Error).message}` }], isError: true };\n }\n }\n );\n\n // ── Tool: list_extensions ──\n server.tool(\n \"list_extensions\",\n \"List all installed extensions (plugins, MCP servers, hooks, skills)\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const bmDir = join(factoryDir, \".beastmode\");\n\n let plugins: Record<string, unknown> = {};\n const lockPath = join(bmDir, \"extensions.lock\");\n if (existsSync(lockPath)) {\n try {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n plugins = lock.plugins || {};\n } catch { /* empty */ }\n }\n\n let mcps: Record<string, unknown> = {};\n try { mcps = listMcps(factoryDir); } catch { /* empty */ }\n\n let hooks: Record<string, unknown[]> = {};\n try { hooks = listHooks(factoryDir); } catch { /* empty */ }\n\n let skills: unknown[] = [];\n try { skills = listSkills(factoryDir); } catch { /* empty */ }\n\n return {\n content: [{\n type: \"text\" as const,\n text: JSON.stringify({ plugins, mcps, hooks, skills }, null, 2),\n }],\n };\n }\n );\n\n // ── Tool: project_list ──\n server.tool(\n \"project_list\",\n \"List all registered projects in this factory\",\n {},\n async () => {\n const factoryDir = getFactoryPath();\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) {\n return { content: [{ type: \"text\" as const, text: \"[]\" }] };\n }\n const projects = readdirSync(projectsDir)\n .filter((f) => f.endsWith(\".json\"))\n .map((f) => {\n try { return JSON.parse(readFileSync(join(projectsDir, f), \"utf-8\")); } catch { return null; }\n })\n .filter(Boolean);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(projects, null, 2) }] };\n }\n );\n\n // ── Tool: project_add ──\n server.tool(\n \"project_add\",\n \"Register a new project by detecting its stack from the given path\",\n { path: z.string().describe(\"Absolute path to the project directory\") },\n async ({ path: projectPath }) => {\n const factoryDir = getFactoryPath();\n const resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) {\n return { content: [{ type: \"text\" as const, text: `Directory not found: ${resolvedPath}` }], isError: true };\n }\n const projectName = basename(resolvedPath);\n const stack = detectStack(resolvedPath);\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n repo: stack.git_remote || undefined,\n stack: {\n detected: stack.framework,\n build_command: stack.suggested_commands.build,\n dev_command: stack.suggested_commands.dev,\n test_command: stack.suggested_commands.test,\n install_command: stack.suggested_commands.install,\n dev_port: stack.dev_port,\n },\n deploy: { target: stack.suggested_deploy },\n plugins: stack.suggested_plugins,\n };\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n mkdirSync(projectsDir, { recursive: true });\n writeFileSync(\n join(projectsDir, `${projectName}.json`),\n JSON.stringify(projectConfig, null, 2) + \"\\n\",\n \"utf-8\"\n );\n return { content: [{ type: \"text\" as const, text: JSON.stringify(projectConfig, null, 2) }] };\n }\n );\n\n // ── Tool: task_create ──\n server.tool(\n \"task_create\",\n \"Create a new task on the board\",\n {\n title: z.string().describe(\"Task title\"),\n description: z.string().optional().describe(\"Task description\"),\n status: z.string().optional().describe(\"Initial status (default: new)\"),\n },\n async ({ title, description, status }) => {\n const factoryDir = getFactoryPath();\n const now = new Date().toISOString();\n const item: BoardItem = {\n id: randomUUID(),\n title,\n description: description || \"\",\n status: status || \"new\",\n created_at: now,\n updated_at: now,\n };\n const items = readBoardItems(factoryDir);\n items.push(item);\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n // ── Tool: task_list ──\n server.tool(\n \"task_list\",\n \"List all tasks on the board, optionally filtered by status\",\n { status: z.string().optional().describe(\"Filter by status\") },\n async ({ status }) => {\n const factoryDir = getFactoryPath();\n let items = readBoardItems(factoryDir);\n if (status) {\n items = items.filter((i) => i.status === status);\n }\n return { content: [{ type: \"text\" as const, text: JSON.stringify(items, null, 2) }] };\n }\n );\n\n // ── Tool: task_update ──\n server.tool(\n \"task_update\",\n \"Update a task on the board (title, description, or status)\",\n {\n id: z.string().describe(\"Task ID\"),\n title: z.string().optional().describe(\"New title\"),\n description: z.string().optional().describe(\"New description\"),\n status: z.string().optional().describe(\"New status\"),\n },\n async ({ id, title, description, status }) => {\n const factoryDir = getFactoryPath();\n const items = readBoardItems(factoryDir);\n const index = items.findIndex((i) => i.id === id);\n if (index === -1) {\n return { content: [{ type: \"text\" as const, text: `Task not found: ${id}` }], isError: true };\n }\n const item = items[index];\n if (title !== undefined) item.title = title;\n if (description !== undefined) item.description = description;\n if (status !== undefined) item.status = status;\n item.updated_at = new Date().toISOString();\n items[index] = item;\n writeBoardItems(factoryDir, items);\n return { content: [{ type: \"text\" as const, text: JSON.stringify(item, null, 2) }] };\n }\n );\n\n return server;\n}\n\n// ── Start the MCP server on stdio ──\n\nexport async function startMcpServer(): Promise<void> {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","/**\n * MCP Server entry point.\n * Started via: beastmode mcp\n */\n\nexport { createMcpServer, startMcpServer } from \"./server.js\";\n","import { Command } from \"commander\";\nimport { initCommand } from \"./cli/commands/init.js\";\nimport { exportCommand } from \"./cli/commands/export-config.js\";\nimport { validateCommand } from \"./cli/commands/validate.js\";\nimport { addCommand } from \"./cli/commands/add.js\";\nimport { removeCommand } from \"./cli/commands/remove.js\";\nimport { listCommand } from \"./cli/commands/list.js\";\nimport { importCommand } from \"./cli/commands/import-cmd.js\";\nimport { statusCommand } from \"./cli/commands/status.js\";\nimport { configCommand } from \"./cli/commands/config-cmd.js\";\nimport { doctorCommand } from \"./cli/commands/doctor.js\";\nimport { upgradeCommand } from \"./cli/commands/upgrade.js\";\nimport { boardCommand } from \"./cli/commands/board.js\";\nimport { migrateCommand } from \"./cli/commands/migrate.js\";\nimport { runCommand } from \"./cli/commands/run.js\";\nimport { daemonCommand } from \"./cli/commands/daemon-cmd.js\";\nimport { mcpCommand } from \"./cli/commands/mcp-cmd.js\";\nimport { deployCommand } from \"./cli/commands/deploy.js\";\nimport { syncClaudeCredsCommand } from \"./cli/commands/sync-claude-creds.js\";\nimport { upCommand } from \"./cli/commands/up.js\";\nimport { downCommand } from \"./cli/commands/down.js\";\nimport { logsCommand } from \"./cli/commands/logs-cmd.js\";\nimport { updateCommand } from \"./cli/commands/update.js\";\nimport { runnerCommand } from \"./cli/commands/runner-cmd.js\";\nimport { projectCommand } from \"./cli/commands/project-cmd.js\";\nimport { ENGINE_VERSION } from \"./engine/version.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"beastmode\")\n .description(\"BeastMode Dark Factory — turn intent into verified software\")\n .version(ENGINE_VERSION);\n\nprogram.addCommand(initCommand);\nprogram.addCommand(boardCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(addCommand);\nprogram.addCommand(removeCommand);\nprogram.addCommand(listCommand);\nprogram.addCommand(importCommand);\nprogram.addCommand(statusCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(upgradeCommand);\nprogram.addCommand(migrateCommand);\nprogram.addCommand(runCommand);\nprogram.addCommand(daemonCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(deployCommand);\nprogram.addCommand(syncClaudeCredsCommand);\nprogram.addCommand(upCommand);\nprogram.addCommand(downCommand);\nprogram.addCommand(logsCommand);\nprogram.addCommand(updateCommand);\nprogram.addCommand(runnerCommand);\nprogram.addCommand(projectCommand);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport { resolve, basename, join } from \"path\";\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from \"fs\";\nimport {\n detectStack,\n resolveDefaults,\n validateSecrets,\n scaffoldFactory,\n listPresets,\n getPreset,\n FactoryConfigSchema,\n} from \"../../engine/index.js\";\nimport { executeFileActions } from \"../utils/file-writer.js\";\nimport { generateComposeYaml, isGhcrAuthenticated, loginToGhcr, seedConfigFromImage } from \"../utils/docker.js\";\nimport { header, success, info, step, error, warn } from \"../utils/display.js\";\n\nexport const initCommand = new Command(\"init\")\n .description(\"Create a new BeastMode factory\")\n .argument(\"[name]\", \"Factory name (default: current directory name)\")\n .option(\"--project <path>\", \"Path to target project\")\n .option(\"--preset <preset>\", \"Pipeline preset (full, lean, prototype, infra, docs)\")\n .option(\"--backend <backend>\", \"Task backend (beastmode-board, github-issues)\")\n .option(\"--deploy <target>\", \"Deploy target (pr-only, vercel, aws-ecs, ...)\")\n .option(\"--methodology <name>\", \"Development methodology plugin\")\n .option(\"--plugin <name>\", \"Install plugin (repeatable)\", collect, [])\n .option(\"--from <template>\", \"Import config from template file\")\n .option(\"--ui\", \"Open web wizard instead of CLI\")\n .option(\"--yes\", \"Accept all defaults (non-interactive)\")\n .option(\n \"--project-github-token <token>\",\n \"GitHub PAT for the daemon's project operations (commit/push/PR/merge against PROJECT_DIR's git remote — needs `repo` scope). Alias for the legacy --github-token flag.\",\n )\n .option(\n \"--project-github-token-file <path>\",\n \"Read project GitHub PAT from file (safer than --project-github-token)\",\n )\n .option(\n \"--github-token <token>\",\n \"Deprecated alias for --project-github-token. Kept for backward compat.\",\n )\n .option(\n \"--github-token-file <path>\",\n \"Deprecated alias for --project-github-token-file. Kept for backward compat.\",\n )\n .option(\n \"--ghcr-pull-token <token>\",\n \"GitHub PAT for pulling private beastmode images from ghcr.io/develeap/beastmode/* — needs `read:packages` scope. May be the same as --project-github-token but should normally be a separate dedicated token (Gap 16).\",\n )\n .option(\n \"--ghcr-pull-token-file <path>\",\n \"Read GHCR pull token from file (safer than --ghcr-pull-token)\",\n )\n .option(\"--board-password <password>\", \"Board UI password (avoids interactive prompt)\")\n .option(\"--board-password-file <path>\", \"Read board password from file\")\n .action(async (name, opts) => {\n try {\n await runInit(name, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nfunction collect(val: string, acc: string[]): string[] {\n acc.push(val);\n return acc;\n}\n\ninterface InitOptions {\n project?: string;\n preset?: string;\n backend?: string;\n deploy?: string;\n methodology?: string;\n plugin: string[];\n from?: string;\n ui?: boolean;\n yes?: boolean;\n // Project-side GitHub PAT (commit/push/PR against PROJECT_DIR's git remote)\n projectGithubToken?: string;\n projectGithubTokenFile?: string;\n // Deprecated aliases — see --github-token / --github-token-file flags\n githubToken?: string;\n githubTokenFile?: string;\n // GHCR pull token (pull private beastmode images)\n ghcrPullToken?: string;\n ghcrPullTokenFile?: string;\n boardPassword?: string;\n boardPasswordFile?: string;\n}\n\n/**\n * Read a secret from a file path, trimming whitespace/newlines.\n */\nfunction readSecretFile(filePath: string): string {\n return readFileSync(resolve(filePath), \"utf-8\").trim();\n}\n\n/**\n * Detect if we're inside the beastmode source repo.\n * If daemon/, board/, and cli/ all exist, this is the source repo.\n */\nexport function isSourceRepo(dir: string): boolean {\n return (\n existsSync(resolve(dir, \"daemon\")) &&\n existsSync(resolve(dir, \"board\")) &&\n existsSync(resolve(dir, \"cli\"))\n );\n}\n\nasync function runInit(name: string | undefined, opts: InitOptions): Promise<void> {\n // Handle --ui flag: start web server and open browser\n if (opts.ui) {\n const { startServer } = await import(\"../ui/server.js\");\n const factoryName = name || basename(resolve(\".\"));\n const projectPath = opts.project ? resolve(opts.project) : undefined;\n\n info(\"Starting init wizard...\");\n const uiServer = await startServer({\n port: 7669,\n factoryName,\n projectPath,\n });\n\n info(`Init wizard running at ${uiServer.url}`);\n info(\"Press Ctrl+C to cancel.\\n\");\n\n // Open browser\n try {\n const open = (await import(\"open\")).default;\n await open(uiServer.url);\n } catch {\n info(`Open ${uiServer.url} in your browser to continue.`);\n }\n\n // Keep process alive until server shuts down\n await new Promise<void>((resolve) => {\n uiServer.server.on(\"close\", resolve);\n process.on(\"SIGINT\", async () => {\n info(\"\\nShutting down wizard server...\");\n await uiServer.shutdown();\n resolve();\n });\n });\n return;\n }\n\n // ── Image mode: not inside the source repo ──\n if (!isSourceRepo(resolve(\".\"))) {\n await runImageModeInit(name, opts);\n return;\n }\n\n // ── Source mode: existing behavior below ──\n const totalSteps = 5;\n\n header(\"BeastMode — Dark Factory Init\");\n info(\"Creating your Custom Dark Factory\\n\");\n\n // Resolve factory name\n const factoryName = name || basename(resolve(\".\"));\n\n if (existsSync(factoryName) && existsSync(resolve(factoryName, \".beastmode\"))) {\n throw new Error(`Factory already exists at ./${factoryName}. Use 'beastmode config' to modify.`);\n }\n\n // Handle --from template import\n if (opts.from) {\n const { readFileSync } = await import(\"fs\");\n const templateContent = readFileSync(resolve(opts.from), \"utf-8\");\n const { parseTemplate } = await import(\"../../engine/template-importer.js\");\n const template = parseTemplate(templateContent);\n\n info(`Importing from template: ${opts.from}`);\n if (template.factory_name) info(`Template factory: ${template.factory_name}`);\n\n // Use template config but still need project path\n if (!opts.project) {\n throw new Error(\"--project is required when using --from\");\n }\n const templateProjectPath = resolve(opts.project);\n const templateStack = detectStack(templateProjectPath);\n const templateProjectName = basename(templateProjectPath);\n\n const actions = scaffoldFactory(factoryName, template.config, {\n name: templateProjectName,\n repo: templateStack.git_remote || undefined,\n path: templateProjectPath,\n stack: templateStack,\n });\n\n executeFileActions(actions);\n\n for (const action of actions) {\n if (!action.path.endsWith(\".gitkeep\")) {\n success(action.path.replace(`${factoryName}/`, \"\"));\n }\n }\n\n console.log();\n header(`Factory \"${factoryName}\" created from template!`);\n console.log();\n info(` Plugins to install: ${template.plugins.join(\", \") || \"none\"}`);\n info(` Start the board: cd ${factoryName} && beastmode board`);\n console.log();\n return;\n }\n\n // ── Step 1: DETECT ──\n step(1, totalSteps, \"Detect\");\n\n let projectPath: string;\n if (opts.project) {\n projectPath = resolve(opts.project);\n } else if (opts.yes) {\n projectPath = resolve(\".\");\n info(\"No --project specified, using current directory\");\n } else {\n const answer = await inquirer.prompt([\n {\n type: \"input\",\n name: \"project\",\n message: \"Path to your project:\",\n default: \".\",\n validate: (input: string) =>\n existsSync(resolve(input)) || `Directory not found: ${input}`,\n },\n ]);\n projectPath = resolve(answer.project);\n }\n\n const stack = detectStack(projectPath);\n success(`Detected: ${stack.framework} (${stack.language}) with ${stack.package_manager || \"no package manager\"}`);\n info(` Build: ${stack.suggested_commands.build}`);\n info(` Dev: ${stack.suggested_commands.dev} (port ${stack.dev_port})`);\n info(` Test: ${stack.suggested_commands.test}`);\n if (stack.git_remote) info(` Repo: ${stack.git_remote}`);\n\n if (!opts.yes) {\n const { accept } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"accept\",\n message: \"Accept detected settings?\",\n default: true,\n },\n ]);\n if (!accept) {\n const overrides = await inquirer.prompt([\n { type: \"input\", name: \"build\", message: \"Build command:\", default: stack.suggested_commands.build },\n { type: \"input\", name: \"dev\", message: \"Dev command:\", default: stack.suggested_commands.dev },\n { type: \"input\", name: \"test\", message: \"Test command:\", default: stack.suggested_commands.test },\n { type: \"input\", name: \"install\", message: \"Install command:\", default: stack.suggested_commands.install },\n { type: \"number\", name: \"port\", message: \"Dev port:\", default: stack.dev_port },\n ]);\n stack.suggested_commands.build = overrides.build;\n stack.suggested_commands.dev = overrides.dev;\n stack.suggested_commands.test = overrides.test;\n stack.suggested_commands.install = overrides.install;\n stack.dev_port = overrides.port;\n }\n }\n\n // ── Step 2: CONFIGURE ──\n step(2, totalSteps, \"Configure\");\n\n let presetName = opts.preset || stack.suggested_preset;\n let backendAdapter = opts.backend || \"beastmode-board\";\n let deployTarget = opts.deploy || stack.suggested_deploy;\n\n if (!opts.yes) {\n const presetChoices = listPresets().map((p) => ({\n name: `${p}${p === stack.suggested_preset ? \" (recommended)\" : \"\"} — ${getPreset(p).description}`,\n value: p,\n }));\n\n const configAnswers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Pipeline preset:\",\n choices: presetChoices,\n default: stack.suggested_preset,\n },\n {\n type: \"list\",\n name: \"backend\",\n message: \"Task backend:\",\n choices: [\n { name: \"BeastMode Board (built-in, zero setup)\", value: \"beastmode-board\" },\n { name: \"GitHub Issues\", value: \"github-issues\" },\n { name: \"Linear (requires plugin)\", value: \"linear\" },\n { name: \"Jira (requires plugin)\", value: \"jira\" },\n ],\n default: \"beastmode-board\",\n },\n {\n type: \"list\",\n name: \"deploy\",\n message: \"Delivery target:\",\n choices: [\n { name: \"PR only (no deploy)\", value: \"pr-only\" },\n { name: `Vercel${stack.suggested_deploy === \"vercel\" ? \" (recommended)\" : \"\"}`, value: \"vercel\" },\n { name: \"AWS ECS (Fargate)\", value: \"aws-ecs\" },\n { name: \"AWS Lambda\", value: \"aws-lambda\" },\n { name: \"GCP Cloud Run\", value: \"gcp-cloud-run\" },\n { name: \"Kubernetes\", value: \"kubernetes\" },\n { name: \"Docker Compose\", value: \"docker-compose\" },\n { name: \"Static host\", value: \"static-host\" },\n { name: \"Custom\", value: \"custom\" },\n ],\n default: stack.suggested_deploy,\n },\n ]);\n\n presetName = configAnswers.preset;\n backendAdapter = configAnswers.backend;\n deployTarget = configAnswers.deploy;\n }\n\n success(`Preset: ${presetName}, Backend: ${backendAdapter}, Deploy: ${deployTarget}`);\n\n // ── Step 3: EXTEND ──\n step(3, totalSteps, \"Extend\");\n\n if (stack.suggested_plugins.length > 0 && !opts.yes) {\n info(`Suggested plugins for ${stack.framework}: ${stack.suggested_plugins.join(\", \")}`);\n info(\"Plugin installation will be available in Phase 2.\");\n }\n success(\"Extensions configured\");\n\n // ── Step 4: CONNECT ──\n step(4, totalSteps, \"Connect\");\n\n const partialConfig: Record<string, unknown> = {\n pipeline: { preset: presetName },\n task_backend: { adapter: backendAdapter },\n };\n const config = resolveDefaults(partialConfig, stack);\n\n // Apply file-based secrets to env before validation\n if (opts.githubTokenFile && !process.env.GITHUB_TOKEN) {\n process.env.GITHUB_TOKEN = readSecretFile(opts.githubTokenFile);\n } else if (opts.githubToken && !process.env.GITHUB_TOKEN) {\n process.env.GITHUB_TOKEN = opts.githubToken;\n }\n\n const secretReport = validateSecrets(config, process.env as Record<string, string>, {\n deploy_target: deployTarget,\n });\n\n // Show auth info\n info(\"AI auth: Claude Code CLI (`claude login`) — no API key needed\");\n\n if (secretReport.present.length > 0) {\n for (const key of secretReport.present) {\n success(`${key} found in environment`);\n }\n }\n\n // Show optional secrets (not prompted, just mentioned)\n if (secretReport.optional.length > 0) {\n for (const key of secretReport.optional) {\n info(`${key} not set (optional — for faster direct API calls)`);\n }\n }\n\n // Prompt only for required missing secrets\n if (secretReport.missing.length > 0) {\n for (const key of secretReport.missing) {\n if (opts.yes) {\n warn(`${key} not set — add to .beastmode/secrets.env.local later`);\n } else {\n const { value } = await inquirer.prompt([\n {\n type: \"password\",\n name: \"value\",\n message: `${key}:`,\n mask: \"*\",\n },\n ]);\n if (value) {\n process.env[key] = value;\n success(`${key} set`);\n } else {\n warn(`${key} skipped — add later to .beastmode/secrets.env.local`);\n }\n }\n }\n }\n\n // Board UI password\n let uiPassword = opts.boardPassword\n || (opts.boardPasswordFile ? readSecretFile(opts.boardPasswordFile) : \"\")\n || \"\";\n if (!uiPassword && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"uiPassword\",\n message: \"Board UI password (leave empty for no auth):\",\n mask: \"*\",\n },\n ]);\n uiPassword = answer.uiPassword || \"\";\n if (uiPassword) {\n success(\"Board UI password set\");\n } else {\n info(\"No board password — UI will be open (fine for local dev)\");\n }\n } else if (uiPassword) {\n success(\"Board UI password set\");\n }\n\n // ── Step 5: BOOT ──\n step(5, totalSteps, \"Boot\");\n\n const projectName = basename(projectPath);\n const actions = scaffoldFactory(factoryName, config, {\n name: projectName,\n repo: stack.git_remote || undefined,\n path: projectPath,\n stack,\n deploy_target: deployTarget,\n });\n\n executeFileActions(actions);\n\n for (const action of actions) {\n if (!action.path.endsWith(\".gitkeep\")) {\n success(action.path.replace(`${factoryName}/`, \"\"));\n }\n }\n\n // Write collected secrets\n const collectedSecrets: string[] = [];\n for (const req of secretReport.required) {\n const val = process.env[req.name];\n if (val) {\n collectedSecrets.push(`${req.name}=${val}`);\n }\n }\n if (uiPassword) {\n collectedSecrets.push(`BEASTMODE_UI_PASSWORD=${uiPassword}`);\n }\n if (collectedSecrets.length > 0) {\n const secretsPath = resolve(factoryName, \".beastmode\", \"secrets.env.local\");\n const secretsContent =\n \"# BeastMode secrets — DO NOT COMMIT\\n\" + collectedSecrets.join(\"\\n\") + \"\\n\";\n // Overwrite the placeholder secrets file\n const { writeFileSync: writeSecrets } = await import(\"fs\");\n writeSecrets(secretsPath, secretsContent, \"utf-8\");\n }\n\n // On macOS, install the Claude-creds LaunchAgent out of the box.\n //\n // Why: Claude Code stores its OAuth token in the macOS Keychain,\n // which Docker containers cannot read. Without a host-side sync,\n // every ``docker compose up -d daemon`` comes up with no\n // credentials and every Phase 1 spec run aborts with \"Claude CLI\n // Not Logged In\" (observed live 2026-04-18 after the PR #47\n // daemon rebuild — 15+ items cascaded to Stuck in under 10\n // minutes before a human spotted it).\n //\n // We seed ``~/.claude/.credentials.json`` immediately so the very\n // first daemon boot has auth, then install a launchd agent that\n // re-syncs every 30 minutes so the file stays fresh as the host\n // CLI refreshes the token. Both steps are best-effort — if the\n // user hasn't run ``claude login`` yet, we print a warning and\n // continue instead of blowing up scaffold.\n if (process.platform === \"darwin\") {\n try {\n const { syncClaudeCredsOnce, installAgent } = await import(\"./sync-claude-creds.js\");\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Claude creds sync skipped: ${sync.error}`);\n info(\" Run \\`beastmode sync-claude-creds --install\\` after \\`claude login\\`.\");\n } else {\n success(`Claude creds synced: ${sync.path}`);\n try {\n installAgent(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds LaunchAgent install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (process.platform === \"linux\") {\n // On Linux, the Claude CLI writes the credentials file directly\n // — no Keychain extraction needed. We still install a systemd\n // user timer so the OAuth token is refreshed periodically. The\n // daemon container then sees the refreshed creds via its bind\n // mount on ~/.claude/.credentials.json. Best-effort.\n try {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Claude creds check skipped: ${sync.error}`);\n info(\" Run \\`claude login\\` then \\`beastmode sync-claude-creds --install\\`.\");\n } else {\n success(`Claude creds validated: ${sync.path}`);\n try {\n installAgentLinux(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds timer install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // Final output\n console.log();\n header(`Factory \"${factoryName}\" is ready!`);\n console.log();\n info(` Start the board: cd ${factoryName} && beastmode board`);\n info(` Run locally: cd ${factoryName} && beastmode run`);\n info(` Start daemon: cd ${factoryName} && beastmode daemon`);\n info(` Add a project: beastmode add project ../other-app`);\n info(` Add a plugin: beastmode add plugin prisma`);\n if (process.platform === \"linux\") {\n info(` Deploy service: cd ${factoryName} && beastmode deploy`);\n }\n console.log();\n}\n\nasync function runImageModeInit(\n name: string | undefined,\n opts: InitOptions\n): Promise<void> {\n const totalSteps = 4;\n header(\"BeastMode — Factory Init (Image Mode)\");\n info(\"Setting up BeastMode from pre-built Docker images\\n\");\n\n const factoryName = name || \".\";\n const targetDir = resolve(factoryName === \".\" ? \".\" : factoryName);\n\n // ── Step 1: Credentials ──\n //\n // Gap 16 (2026-04-15): beastmode needs TWO distinct GitHub PATs\n // because they have orthogonal concerns:\n //\n // 1. PROJECT_GITHUB_TOKEN — used by the daemon and Claude to commit /\n // push / open PRs / merge / review against the target project repo\n // (the git remote of PROJECT_DIR). Per-user, rotates often, needs\n // `repo` scope.\n //\n // 2. GHCR_PULL_TOKEN — used by `docker compose pull` to fetch the\n // beastmode factory images from ghcr.io/develeap/beastmode/*.\n // Develeap publishes these privately, so every user needs a pull\n // token. Maintainer-provided (shareable across a team) or a\n // user-owned PAT with `read:packages` scope added. Rotates rarely.\n //\n // Conflating these in a single GITHUB_TOKEN forces users to give\n // write-level scope for a read-level task, enlarges the blast radius\n // of any leaked credential, and ties rotation cadences together.\n // See docs/zero-to-productive-readiness.md Gap 16.\n step(1, totalSteps, \"Credentials\");\n\n // Project-side PAT (the daemon's git operations)\n let projectGithubToken = opts.projectGithubToken\n || (opts.projectGithubTokenFile ? readSecretFile(opts.projectGithubTokenFile) : \"\")\n || opts.githubToken\n || (opts.githubTokenFile ? readSecretFile(opts.githubTokenFile) : \"\")\n || process.env.PROJECT_GITHUB_TOKEN\n || process.env.GITHUB_TOKEN\n || \"\";\n if (!projectGithubToken && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"token\",\n message:\n \"PROJECT_GITHUB_TOKEN (PAT for project commits/pushes/PRs — `repo` scope, or `public_repo` for public-only):\",\n mask: \"*\",\n },\n ]);\n projectGithubToken = answer.token || \"\";\n }\n if (projectGithubToken) {\n success(\"PROJECT_GITHUB_TOKEN set\");\n } else {\n warn(\"PROJECT_GITHUB_TOKEN not set — daemon's git operations will fail until added to .env\");\n }\n\n // GHCR pull token (separate concern — see Gap 16 in the readiness doc)\n let ghcrPullToken = opts.ghcrPullToken\n || (opts.ghcrPullTokenFile ? readSecretFile(opts.ghcrPullTokenFile) : \"\")\n || process.env.GHCR_PULL_TOKEN\n || \"\";\n if (!ghcrPullToken && !opts.yes) {\n const answer = await inquirer.prompt([\n {\n type: \"password\",\n name: \"token\",\n message:\n \"GHCR_PULL_TOKEN (PAT for pulling private beastmode images from ghcr.io/develeap/beastmode/* — `read:packages` scope. Leave empty to fall back to the project token):\",\n mask: \"*\",\n },\n ]);\n ghcrPullToken = answer.token || \"\";\n }\n // Sensible default: if the user provided only the project token, use\n // it for GHCR too. They can split later.\n if (!ghcrPullToken && projectGithubToken) {\n ghcrPullToken = projectGithubToken;\n info(\"GHCR_PULL_TOKEN: falling back to PROJECT_GITHUB_TOKEN (you can split them later in .env)\");\n } else if (ghcrPullToken) {\n success(\"GHCR_PULL_TOKEN set\");\n } else {\n warn(\"GHCR_PULL_TOKEN not set — `docker compose pull` will fail for private images. Add to .env later.\");\n }\n\n // Backward-compat alias used by the rest of init / compose generator\n // until they're updated to read both tokens explicitly.\n const githubToken = projectGithubToken;\n\n // Board UI password\n let uiPassword = opts.boardPassword\n || (opts.boardPasswordFile ? readSecretFile(opts.boardPasswordFile) : \"\")\n || \"\";\n if (!uiPassword && !opts.yes) {\n const { password } = await inquirer.prompt([\n {\n type: \"password\",\n name: \"password\",\n message: \"Board UI password (leave empty for no auth):\",\n mask: \"*\",\n },\n ]);\n uiPassword = password || \"\";\n if (uiPassword) success(\"Board UI password set\");\n else info(\"No board password — UI will be open\");\n } else if (uiPassword) {\n success(\"Board UI password set\");\n }\n\n // Project path — REQUIRED. The daemon's git operations target the git\n // remote of this path. Observed 2026-04-14 that a missing PROJECT_DIR\n // silently causes every task to fail 10 minutes into its build phase.\n // See docs/zero-to-productive-readiness.md Gap 1.\n let projectPath: string;\n if (opts.project) {\n projectPath = resolve(opts.project);\n if (!existsSync(projectPath)) {\n error(`--project path does not exist: ${projectPath}`);\n process.exit(1);\n }\n success(`Project path: ${projectPath}`);\n } else if (opts.yes) {\n // Non-interactive mode: fall back to the current directory, but\n // only if it looks like a git repo. Don't silently trap the user\n // in a broken factory.\n const cwd = resolve(\".\");\n if (!existsSync(join(cwd, \".git\"))) {\n error(\n \"--project is required in non-interactive mode (--yes) unless \" +\n \"you run from inside a git repository. Pass --project <path> or \" +\n \"cd into your project clone first.\"\n );\n process.exit(1);\n }\n projectPath = cwd;\n info(`No --project specified, using current directory: ${projectPath}`);\n } else {\n const answer = await inquirer.prompt([\n {\n type: \"input\",\n name: \"project\",\n message:\n \"Path to your project (must be a git clone with an origin remote):\",\n default: \".\",\n validate: (input: string) => {\n const p = resolve(input);\n if (!existsSync(p)) return `Directory not found: ${p}`;\n if (!existsSync(join(p, \".git\"))) {\n return `Not a git repo: ${p} (run 'git init' first, or pick a different path)`;\n }\n return true;\n },\n },\n ]);\n projectPath = resolve(answer.project);\n success(`Project path: ${projectPath}`);\n }\n\n // ── Step 2: Docker auth ──\n step(2, totalSteps, \"Docker Registry\");\n\n if (!isGhcrAuthenticated()) {\n // Auto-attempt login using the GHCR pull token (Gap 16). Falls back\n // to the project token if pull-token wasn't provided — they may be\n // the same value in single-PAT setups.\n const tokenForLogin = ghcrPullToken || projectGithubToken;\n if (tokenForLogin && loginToGhcr(tokenForLogin)) {\n success(\n `Authenticated to ghcr.io (via ${ghcrPullToken ? \"GHCR_PULL_TOKEN\" : \"PROJECT_GITHUB_TOKEN fallback\"})`,\n );\n } else {\n info(\"Not logged in to ghcr.io — images may still pull if public\");\n info(\" To log in manually: docker login ghcr.io -u <your-github-username>\");\n if (!opts.yes && !opts.githubToken && !opts.projectGithubToken && !opts.ghcrPullToken) {\n const { retry } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"retry\",\n message: \"Continue anyway?\",\n default: true,\n },\n ]);\n if (!retry) {\n error(\"Aborted — log in to ghcr.io first\");\n process.exit(1);\n }\n }\n }\n } else {\n success(\"Authenticated to ghcr.io\");\n }\n\n // ── Step 3: Generate files ──\n step(3, totalSteps, \"Generate\");\n\n mkdirSync(targetDir, { recursive: true });\n\n // docker-compose.yml\n const composeContent = generateComposeYaml(\"latest\");\n writeFileSync(join(targetDir, \"docker-compose.yml\"), composeContent, \"utf-8\");\n success(\"docker-compose.yml\");\n\n // .env\n //\n // PROJECT_DIR is REQUIRED (Gap 1 of the readiness checklist). We\n // write the resolved projectPath from Step 1 directly so the user\n // doesn't have to edit .env after init — observed 2026-04-14 that a\n // commented-out PROJECT_DIR silently causes every task to fail 10\n // minutes into its build phase.\n //\n // PROJECT_REPO is NOT written. As of 2026-04-15 the daemon\n // auto-resolves the github repo from `git -C $PROJECT_DIR remote\n // get-url origin` at startup (Gap 2 — see\n // daemon/beastmode_daemon/project_repo.py). The env var is only\n // needed as a last-resort override when the project dir has no\n // origin remote, and in that case we surface a clear error at\n // daemon startup telling the user exactly how to fix it.\n const envLines: string[] = [\n \"# BeastMode environment — DO NOT COMMIT\",\n \"\",\n \"# ── Project credentials (Gap 16 — two-PAT model) ──────────────\",\n \"# PROJECT_GITHUB_TOKEN: used by the daemon and Claude to commit /\",\n \"# push / open PRs / merge / review against the target project repo.\",\n \"# Needs `repo` scope for private repos, `public_repo` for public.\",\n \"# Aliased to GITHUB_TOKEN for backward compat with the gh CLI and\",\n \"# any code that still reads GITHUB_TOKEN.\",\n `PROJECT_GITHUB_TOKEN=${projectGithubToken}`,\n `GITHUB_TOKEN=${projectGithubToken}`,\n \"\",\n \"# GHCR_PULL_TOKEN: used by `docker compose pull` to fetch the\",\n \"# beastmode factory images from ghcr.io/develeap/beastmode/*.\",\n \"# Maintainer-provided (shared across a team) or your own PAT with\",\n \"# `read:packages` scope added. Rotates rarely. May be the same as\",\n \"# PROJECT_GITHUB_TOKEN but is normally a separate dedicated token.\",\n `GHCR_PULL_TOKEN=${ghcrPullToken}`,\n \"\",\n `BEASTMODE_UI_PASSWORD=${uiPassword}`,\n \"\",\n \"# ── Project location ─────────────────────────────────────────\",\n \"# Required. The daemon's git operations target the git remote of\",\n \"# this path. The daemon auto-resolves the github repo from\",\n \"# `git -C $PROJECT_DIR remote get-url origin` at startup.\",\n `PROJECT_DIR=${projectPath}`,\n \"\",\n \"# ── Optional ─────────────────────────────────────────────────\",\n \"# Uncomment for faster direct Anthropic API calls (bypasses the\",\n \"# Claude Code subscription auth via ~/.claude.json).\",\n \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"\",\n \"# Last-resort override if the daemon's project_repo auto-resolution\",\n \"# (git remote get-url origin) doesn't work for your setup.\",\n \"# The daemon handles this automatically in >99% of cases.\",\n \"# PROJECT_REPO=owner/repo\",\n \"\",\n ];\n writeFileSync(join(targetDir, \".env\"), envLines.join(\"\\n\"), \"utf-8\");\n success(`.env (PROJECT_DIR=${projectPath}, two-PAT model)`);\n\n // Create directories\n for (const dir of [\"data\", \"runs\", \"daemon/logs\", \".beastmode\", \"config\"]) {\n mkdirSync(join(targetDir, dir), { recursive: true });\n }\n\n // ── Step 4: Pull images ──\n step(4, totalSteps, \"Pull Images\");\n\n try {\n const { execSync: exec } = await import(\"child_process\");\n exec(\"docker compose pull\", {\n cwd: targetDir,\n stdio: \"inherit\",\n timeout: 300_000,\n });\n success(\"Images pulled successfully\");\n\n // Seed default config files from the daemon image\n if (seedConfigFromImage(targetDir, \"latest\")) {\n success(\"Default config files seeded\");\n }\n } catch {\n console.log();\n error(\"Failed to pull BeastMode images from ghcr.io.\");\n console.log();\n info(\" This usually means your GitHub account doesn't have access to the\");\n info(\" BeastMode container registry.\");\n console.log();\n info(\" To fix this:\");\n info(\" 1. Ask your admin to grant you access to the BeastMode packages\");\n info(\" on the develeap GitHub org\");\n info(\" 2. Create a GitHub PAT with read:packages scope\");\n info(\" 3. Run: docker login ghcr.io -u <your-github-username>\");\n info(\" (use the PAT as password)\");\n info(\" 4. Then re-run: beastmode init\");\n console.log();\n warn(\"Files generated — fix auth above, then run: beastmode up --pull\");\n }\n\n // Same Keychain-sync setup as runInit. See the comment there for\n // the 2026-04-18 incident rationale.\n if (process.platform === \"darwin\") {\n try {\n const { syncClaudeCredsOnce, installAgent } = await import(\"./sync-claude-creds.js\");\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Claude creds sync skipped: ${sync.error}`);\n info(\" Run \\`beastmode sync-claude-creds --install\\` after \\`claude login\\`.\");\n } else {\n success(`Claude creds synced: ${sync.path}`);\n try {\n installAgent(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds LaunchAgent install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n } else if (process.platform === \"linux\") {\n // On Linux, the Claude CLI writes the credentials file directly\n // — no Keychain extraction needed. We still install a systemd\n // user timer so the OAuth token is refreshed periodically. The\n // daemon container then sees the refreshed creds via its bind\n // mount on ~/.claude/.credentials.json. Best-effort.\n try {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Claude creds check skipped: ${sync.error}`);\n info(\" Run \\`claude login\\` then \\`beastmode sync-claude-creds --install\\`.\");\n } else {\n success(`Claude creds validated: ${sync.path}`);\n try {\n installAgentLinux(1800, { throwOnError: true });\n } catch (e) {\n warn(`Claude-creds timer install failed: ${e instanceof Error ? e.message : String(e)}`);\n info(\" You can retry with: beastmode sync-claude-creds --install\");\n }\n }\n } catch (e) {\n warn(`Claude-creds setup skipped: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // Final output\n console.log();\n header(\"BeastMode is ready!\");\n console.log();\n info(\" Start: beastmode up\");\n info(\" Board UI: http://localhost:8420\");\n if (uiPassword) {\n info(` Board password: ${uiPassword}`);\n }\n info(\" Add a project: beastmode project add /path/to/repo\");\n info(\" View logs: beastmode logs\");\n info(\" Stop: beastmode down\");\n info(\" Update images: beastmode update\");\n console.log();\n}\n","import { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { execSync, type ExecSyncOptions } from \"child_process\";\n\nexport const GHCR_IMAGE_PREFIX = \"ghcr.io/develeap/beastmode\";\n\n/**\n * Find docker-compose.yml in a directory.\n * Returns the full path or null.\n */\nexport function findComposeFile(dir: string): string | null {\n const path = join(dir, \"docker-compose.yml\");\n return existsSync(path) ? path : null;\n}\n\n/**\n * Require docker-compose.yml to exist. Throws with a helpful message if not.\n */\nexport function requireComposeFile(dir: string): string {\n const path = findComposeFile(dir);\n if (!path) {\n throw new Error(\n \"docker-compose.yml not found in the current directory.\\n\" +\n \"Run `beastmode init` first to generate it.\"\n );\n }\n return path;\n}\n\n/**\n * Run a docker compose command. Returns stdout.\n * Throws on non-zero exit with stderr.\n */\nexport function runCompose(\n args: string[],\n opts?: { cwd?: string; inherit?: boolean }\n): string {\n const cmd = [\"docker\", \"compose\", ...args].join(\" \");\n const execOpts: ExecSyncOptions = {\n cwd: opts?.cwd ?? process.cwd(),\n encoding: \"utf-8\",\n timeout: 300_000,\n stdio: opts?.inherit ? \"inherit\" : [\"pipe\", \"pipe\", \"pipe\"],\n };\n return execSync(cmd, execOpts) as string;\n}\n\n/**\n * Check if Docker is running.\n */\nexport function isDockerRunning(): boolean {\n try {\n execSync(\"docker info\", {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the user is authenticated to ghcr.io.\n */\nexport function isGhcrAuthenticated(): boolean {\n try {\n const out = execSync(\"docker login ghcr.io --get-login 2>/dev/null\", {\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return out.trim().length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get the current image digest for a service.\n * Returns digest string or null.\n */\nexport function getImageDigest(service: string, cwd?: string): string | null {\n try {\n const out = execSync(\n `docker compose images ${service} --format json 2>/dev/null`,\n {\n cwd: cwd ?? process.cwd(),\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }\n );\n const parsed = JSON.parse(out.trim().split(\"\\n\")[0] || \"{}\");\n return parsed.Digest || parsed.digest || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Attempt to log in to ghcr.io using a GitHub PAT.\n * After login, verifies the credential can actually pull images (needs read:packages scope).\n * If verification fails, logs out to restore anonymous access (public images work without auth).\n * Returns true only if login AND verification succeed.\n */\nexport function loginToGhcr(token: string): boolean {\n try {\n execSync(`echo \"${token}\" | docker login ghcr.io -u beastmode --password-stdin`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n // Verify the credential actually works for pulling (needs read:packages scope).\n // docker login succeeds with any valid PAT regardless of scopes — it just stores\n // the credential without checking. A token without read:packages will cause \"denied\"\n // on pull, which is worse than anonymous access for public images.\n try {\n execSync(`docker manifest inspect ${GHCR_IMAGE_PREFIX}/board:latest`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n // Token lacks read:packages — remove the bad credential to restore anonymous access\n try {\n execSync(\"docker logout ghcr.io\", {\n encoding: \"utf-8\",\n timeout: 5_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore logout failures\n }\n return false;\n }\n } catch {\n return false;\n }\n}\n\n/**\n * Seed default config files from the daemon image into a host directory.\n * Creates a temporary container, copies /app/config/ contents, then removes it.\n * Non-fatal — entrypoint self-seed is the fallback.\n */\nexport function seedConfigFromImage(targetDir: string, tag: string): boolean {\n const configDir = join(targetDir, \"config\");\n const containerName = \"bm-config-seed\";\n try {\n // Clean up any leftover container from a previous failed run\n try {\n execSync(`docker rm -f ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore — container doesn't exist\n }\n\n execSync(`docker create --name ${containerName} ${GHCR_IMAGE_PREFIX}/daemon:${tag}`, {\n encoding: \"utf-8\",\n timeout: 30_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n execSync(`docker cp ${containerName}:/app/config/. \"${configDir}/\"`, {\n encoding: \"utf-8\",\n timeout: 15_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n execSync(`docker rm ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n return true;\n } catch {\n // Non-fatal cleanup\n try {\n execSync(`docker rm -f ${containerName}`, {\n encoding: \"utf-8\",\n timeout: 10_000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n } catch {\n // Ignore\n }\n return false;\n }\n}\n\n/**\n * Generate a docker-compose.yml with GHCR image references.\n */\nexport function generateComposeYaml(tag: string): string {\n return `services:\n # Python board API — data layer (SQLite + WebSocket). Internal only.\n board:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/board:${tag}\n expose:\n - \"8080\"\n volumes:\n - ./data:/app/data\n healthcheck:\n test: [\"CMD\", \"python\", \"-c\", \"import urllib.request; urllib.request.urlopen('http://localhost:8080/api/health')\"]\n interval: 10s\n timeout: 5s\n retries: 3\n start_period: 5s\n restart: unless-stopped\n\n # Node.js UI server — board UI with password auth.\n # Access at http://localhost:8420\n ui:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/ui:${tag}\n ports:\n - \"\\${UI_PORT:-8420}:8080\"\n env_file:\n - path: .env\n required: false\n environment:\n - BEASTMODE_BOARD_URL=http://board:8080\n - BEASTMODE_UI_PASSWORD=\\${BEASTMODE_UI_PASSWORD:-}\n volumes:\n - ./.beastmode:/app/.beastmode\n # Daemon config files. The Settings UI writes pipeline.* changes here\n # so they propagate to the daemon container on next restart.\n - ./config:/app/config\n - ./runs:/app/runs\n - ./daemon/logs:/app/daemon/logs:ro\n # Claude credentials for the chat feature. Claude Code stores\n # auth in TWO places on the host: ~/.claude.json (sibling file,\n # auth + settings) and ~/.claude/ (directory with backups/,\n # projects/, ...). Both must be mounted — the daemon's\n # docker-entrypoint.sh reads $HOME/.claude.json directly, and\n # pre-2026-04-18 only the directory was mounted, so every\n # container recreate came up un-authenticated and every Phase 1\n # spec run aborted with \"Claude CLI Not Logged In\".\n - type: bind\n source: \\${HOME}/.claude.json\n target: /home/appuser/.claude.json\n read_only: true\n - \\${HOME}/.claude:/home/appuser/.claude:ro\n depends_on:\n board:\n condition: service_healthy\n restart: unless-stopped\n\n # Pipeline daemon — polls board, runs tasks\n daemon:\n platform: linux/amd64\n image: ${GHCR_IMAGE_PREFIX}/daemon:${tag}\n env_file:\n - path: .env\n required: false\n environment:\n - BEASTMODE_MODE=daemon\n - BEASTMODE_CONFIG=/app/config/beastmode.docker.json\n - BEASTMODE_ROOT=/app\n - BEASTMODE_BOARD_URL=http://board:8080\n volumes:\n # Factory state (projects, extensions, deploy strategies). Shared\n # with the ui container so Settings UI edits AND daemon-side\n # template seeding (from project-templates/) both land in the same\n # bind-mounted location. Pre-2026-04-15 this mount was missing\n # from the daemon service, which silently caused the daemon's\n # template-seeding logic to write to ephemeral in-container\n # storage — the seeded files were invisible to the ui and lost\n # on restart.\n - ./.beastmode:/app/.beastmode\n # Daemon config files. Mounted from the host so Settings UI writes\n # (to beastmode.docker.json) are picked up on daemon restart without\n # rebuilding the image.\n - ./config:/app/config\n - ./runs:/app/runs\n - ./daemon/logs:/app/daemon/logs\n - /var/run/docker.sock:/var/run/docker.sock\n # PROJECT_DIR is REQUIRED — the daemon targets its git remote for\n # all merge/push/PR operations. Writing without a fallback so\n # 'docker compose up' fails loudly if the user has deleted the\n # PROJECT_DIR line from .env instead of silently mounting the\n # beatmode runtime dir (which has no source code). See\n # docs/zero-to-productive-readiness.md Gap 1.\n - \\${PROJECT_DIR:?PROJECT_DIR must be set in .env — run 'beastmode init' to regenerate}:/app/project\n # See the ui service for the two-mount rationale. Without the\n # sibling-file mount every daemon recreate comes up without\n # Claude auth and every Phase 1 spec run aborts with\n # \"Claude CLI Not Logged In\" (2026-04-18 incident).\n - type: bind\n source: \\${HOME}/.claude.json\n target: /home/appuser/.claude.json\n read_only: true\n - \\${HOME}/.claude:/home/appuser/.claude\n depends_on:\n board:\n condition: service_healthy\n restart: unless-stopped\n`;\n}\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync, existsSync, readdirSync } from \"fs\";\nimport { resolve, join } from \"path\";\nimport { runExportAdapter } from \"../../engine/export-adapter.js\";\nimport { success, error, info, header } from \"../utils/display.js\";\n\n// ── Existing config export (unchanged) ──\n\nexport function exportFactory(factoryDir: string, outputPath: string): void {\n const bmDir = join(factoryDir, \".beastmode\");\n\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(`No factory found at ${factoryDir}`);\n }\n\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const identity = JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"));\n\n let plugins: string[] = [];\n const lockPath = join(bmDir, \"extensions.lock\");\n if (existsSync(lockPath)) {\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n plugins = Object.keys(lock.plugins || {});\n }\n\n const template = {\n factory_name: identity.factory_name,\n engine_version: identity.engine_version,\n config,\n plugins,\n };\n\n writeFileSync(outputPath, JSON.stringify(template, null, 2) + \"\\n\", \"utf-8\");\n}\n\n// ── Artifact export helpers ──\n\nfunction findRunDir(runId: string): string {\n // Search in current directory's runs/ and direct path patterns\n const candidates = [\n resolve(\".\", \"runs\", runId),\n resolve(\".\", runId),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `Run directory not found for '${runId}'. Searched: ${candidates.join(\", \")}`\n );\n}\n\nfunction createArtifactExportCommand(artifact: \"nlspec\" | \"plan\" | \"scenarios\"): Command {\n return new Command(artifact)\n .description(`Export ${artifact} from a pipeline run`)\n .requiredOption(\"--run <id>\", \"Run ID to export from\")\n .option(\"--adapter <id>\", \"Export adapter (default: generic:markdown)\", \"generic:markdown\")\n .option(\"--output <path>\", \"Output file path (default: stdout)\")\n .action((opts) => {\n try {\n const runDir = findRunDir(opts.run);\n\n let sourceContent: string;\n if (artifact === \"scenarios\") {\n // Concatenate all scenario files\n const scenariosDir = join(runDir, \"scenarios\");\n if (!existsSync(scenariosDir)) {\n throw new Error(`No scenarios directory found in run ${opts.run}`);\n }\n const files = readdirSync(scenariosDir)\n .filter((f) => f.endsWith(\".md\"))\n .sort();\n sourceContent = files\n .map((f) => readFileSync(join(scenariosDir, f), \"utf-8\"))\n .join(\"\\n\\n---\\n\\n\");\n } else {\n const artifactFile = artifact === \"nlspec\" ? \"nlspec.md\" : \"plan.md\";\n const artifactPath = join(runDir, artifactFile);\n if (!existsSync(artifactPath)) {\n throw new Error(`${artifactFile} not found in run ${opts.run}`);\n }\n sourceContent = readFileSync(artifactPath, \"utf-8\");\n }\n\n const result = runExportAdapter(opts.adapter, sourceContent);\n\n if (opts.output) {\n writeFileSync(resolve(opts.output), result, \"utf-8\");\n header(`Exported ${artifact}`);\n success(`Written to: ${opts.output}`);\n } else {\n process.stdout.write(result);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\n// ── Build the export command ──\n\nexport const exportCommand = new Command(\"export\")\n .description(\"Export factory config or pipeline artifacts\");\n\n// Config export (existing)\nexportCommand.addCommand(\n new Command(\"config\")\n .description(\"Export factory configuration template (secrets excluded)\")\n .option(\"--output <path>\", \"Output file path\", \"beastmode-template.json\")\n .action((opts) => {\n try {\n const factoryDir = resolve(\".\");\n exportFactory(factoryDir, resolve(opts.output));\n header(\"Factory template exported\");\n success(`Written to: ${opts.output}`);\n info(\"Share with teammates: beastmode init my-factory --from \" + opts.output);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n);\n\n// Artifact exports (new)\nexportCommand.addCommand(createArtifactExportCommand(\"nlspec\"));\nexportCommand.addCommand(createArtifactExportCommand(\"plan\"));\nexportCommand.addCommand(createArtifactExportCommand(\"scenarios\"));\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { validateFactory } from \"../../engine/config-validator.js\";\nimport { header, success, warn, error, info } from \"../utils/display.js\";\n\nexport const validateCommand = new Command(\"validate\")\n .description(\"Validate factory health\")\n .option(\"--verbose\", \"Show all checks\")\n .action((opts) => {\n const factoryDir = resolve(\".\");\n const result = validateFactory(factoryDir, process.env as Record<string, string>);\n\n header(\"Factory Validation\");\n\n if (result.errors.length > 0) {\n for (const err of result.errors) {\n error(err);\n }\n }\n\n if (result.warnings.length > 0) {\n for (const w of result.warnings) {\n warn(w);\n }\n }\n\n if (result.valid) {\n console.log();\n success(\"All checks passed. Factory is ready.\");\n } else {\n console.log();\n error(`${result.errors.length} error(s) found. Fix them before running.`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { installPlugin } from \"../../engine/plugin-installer.js\";\nimport { addMcp } from \"../../engine/mcp-manager.js\";\nimport { addHook } from \"../../engine/hook-manager.js\";\nimport { addSkill } from \"../../engine/skill-manager.js\";\nimport { success, error } from \"../utils/display.js\";\nimport type { HookEvent } from \"../../engine/types.js\";\n\n/**\n * Install a plugin from a local path, git URL, or registry name.\n * Currently only local paths are supported. Git/registry will be added later.\n */\nexport async function addPluginAction(\n factoryDir: string,\n source: string,\n options?: { version?: string }\n): Promise<void> {\n // For now, only local paths are supported\n // Future: detect source type and handle git clone / registry fetch\n await installPlugin(factoryDir, source);\n}\n\n/**\n * Add an MCP server to the factory.\n */\nexport function addMcpAction(\n factoryDir: string,\n name: string,\n command: string,\n args: string[],\n config?: Record<string, unknown>\n): void {\n addMcp(factoryDir, name, {\n command,\n args,\n config: config || {},\n source: \"user\",\n enabled: true,\n });\n}\n\n/**\n * Add a skill from a directory path.\n */\nexport function addSkillAction(\n factoryDir: string,\n sourcePath: string\n): void {\n addSkill(factoryDir, resolve(sourcePath));\n}\n\n/**\n * Add a hook to a pipeline event.\n */\nexport function addHookAction(\n factoryDir: string,\n event: HookEvent,\n name: string,\n options: {\n command?: string;\n skill?: string;\n webhook?: string;\n config?: Record<string, unknown>;\n }\n): void {\n addHook(factoryDir, event, {\n name,\n command: options.command,\n skill: options.skill,\n webhook: options.webhook,\n config: options.config || {},\n source: \"user\",\n });\n}\n\nexport const addCommand = new Command(\"add\")\n .description(\"Add extensions to the factory\")\n .addCommand(\n new Command(\"plugin\")\n .description(\"Install a plugin (from path, URL, or registry name)\")\n .argument(\"<source>\", \"Plugin source: local path, git URL, or registry name\")\n .option(\"--version <ver>\", \"Specific version to install\")\n .action(async (source: string, opts: { version?: string }) => {\n try {\n const factoryDir = resolve(\".\");\n await addPluginAction(factoryDir, source, opts);\n success(`Plugin installed from ${source}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"mcp\")\n .description(\"Add an MCP server\")\n .argument(\"<name>\", \"Server name\")\n .requiredOption(\"--command <cmd>\", \"Command to run\")\n .option(\"--args <args...>\", \"Command arguments\", [])\n .option(\"--config <json>\", \"Configuration as JSON string\")\n .action(\n (\n name: string,\n opts: { command: string; args: string[]; config?: string }\n ) => {\n try {\n const factoryDir = resolve(\".\");\n const config = opts.config\n ? JSON.parse(opts.config)\n : undefined;\n addMcpAction(factoryDir, name, opts.command, opts.args, config);\n success(`MCP server '${name}' added`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n }\n )\n )\n .addCommand(\n new Command(\"skill\")\n .description(\"Add a custom skill from a directory\")\n .argument(\"<path>\", \"Path to skill directory (must contain SKILL.md)\")\n .action((path: string) => {\n try {\n const factoryDir = resolve(\".\");\n addSkillAction(factoryDir, path);\n success(`Skill added from ${path}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"hook\")\n .description(\"Add a pipeline hook\")\n .argument(\"<event>\", \"Hook event (e.g., pre-build, post-verify)\")\n .argument(\"<name>\", \"Hook name\")\n .option(\"--command <cmd>\", \"Shell command to run\")\n .option(\"--skill <name>\", \"Skill to invoke\")\n .option(\"--webhook <url>\", \"Webhook URL to POST to\")\n .option(\"--config <json>\", \"Configuration as JSON string\")\n .action(\n (\n event: string,\n name: string,\n opts: {\n command?: string;\n skill?: string;\n webhook?: string;\n config?: string;\n }\n ) => {\n try {\n const factoryDir = resolve(\".\");\n const config = opts.config\n ? JSON.parse(opts.config)\n : undefined;\n addHookAction(factoryDir, event as HookEvent, name, {\n command: opts.command,\n skill: opts.skill,\n webhook: opts.webhook,\n config,\n });\n success(`Hook '${name}' added to ${event}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n }\n )\n );\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { removePlugin } from \"../../engine/plugin-installer.js\";\nimport { removeMcp } from \"../../engine/mcp-manager.js\";\nimport { removeHook } from \"../../engine/hook-manager.js\";\nimport { removeSkill } from \"../../engine/skill-manager.js\";\nimport { success, error } from \"../utils/display.js\";\nimport type { HookEvent } from \"../../engine/types.js\";\n\n/**\n * Remove an installed plugin.\n */\nexport function removePluginAction(\n factoryDir: string,\n name: string,\n options?: { force?: boolean }\n): void {\n removePlugin(factoryDir, name, options);\n}\n\n/**\n * Remove an MCP server.\n */\nexport function removeMcpAction(\n factoryDir: string,\n name: string\n): void {\n removeMcp(factoryDir, name);\n}\n\n/**\n * Remove a custom skill.\n */\nexport function removeSkillAction(\n factoryDir: string,\n name: string\n): void {\n removeSkill(factoryDir, name);\n}\n\n/**\n * Remove a hook from a pipeline event.\n */\nexport function removeHookAction(\n factoryDir: string,\n event: HookEvent,\n name: string\n): void {\n removeHook(factoryDir, event, name);\n}\n\nexport const removeCommand = new Command(\"remove\")\n .description(\"Remove extensions from the factory\")\n .addCommand(\n new Command(\"plugin\")\n .description(\"Remove an installed plugin\")\n .argument(\"<name>\", \"Plugin name\")\n .option(\"--force\", \"Force removal even if other plugins depend on it\")\n .action((name: string, opts: { force?: boolean }) => {\n try {\n const factoryDir = resolve(\".\");\n removePluginAction(factoryDir, name, opts);\n success(`Plugin '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"mcp\")\n .description(\"Remove an MCP server\")\n .argument(\"<name>\", \"Server name\")\n .action((name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeMcpAction(factoryDir, name);\n success(`MCP server '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"skill\")\n .description(\"Remove a custom skill\")\n .argument(\"<name>\", \"Skill name\")\n .action((name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeSkillAction(factoryDir, name);\n success(`Skill '${name}' removed`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n )\n .addCommand(\n new Command(\"hook\")\n .description(\"Remove a pipeline hook\")\n .argument(\"<event>\", \"Hook event (e.g., pre-build, post-verify)\")\n .argument(\"<name>\", \"Hook name\")\n .action((event: string, name: string) => {\n try {\n const factoryDir = resolve(\".\");\n removeHookAction(factoryDir, event as HookEvent, name);\n success(`Hook '${name}' removed from ${event}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n })\n );\n","import { Command } from \"commander\";\nimport { resolve } from \"path\";\nimport { readFileSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { listMcps } from \"../../engine/mcp-manager.js\";\nimport { listHooks } from \"../../engine/hook-manager.js\";\nimport { listSkills } from \"../../engine/skill-manager.js\";\nimport { listPresets, getPreset } from \"../../engine/presets.js\";\nimport { header } from \"../utils/display.js\";\n\nexport function listPluginsAction(factoryDir: string): void {\n const lockPath = join(factoryDir, \".beastmode\", \"extensions.lock\");\n if (!existsSync(lockPath)) {\n console.log(\" No plugins installed (extensions.lock not found).\");\n return;\n }\n\n const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n const plugins = lock.plugins || {};\n const names = Object.keys(plugins);\n\n if (names.length === 0) {\n console.log(\" No plugins installed.\");\n return;\n }\n\n header(\"Installed Plugins\");\n for (const name of names) {\n const entry = plugins[name];\n const source = entry.source || \"unknown\";\n const version = entry.version || \"?\";\n console.log(` ${name}@${version} (source: ${source})`);\n }\n}\n\nexport function listMcpsAction(factoryDir: string): void {\n const servers = listMcps(factoryDir);\n const names = Object.keys(servers);\n\n if (names.length === 0) {\n console.log(\" No MCP servers configured.\");\n return;\n }\n\n header(\"MCP Servers\");\n for (const name of names) {\n const entry = servers[name];\n const status = entry.enabled ? \"enabled\" : \"disabled\";\n const cmd = [entry.command, ...entry.args].join(\" \");\n console.log(` ${name} ${cmd} [${entry.source}] (${status})`);\n }\n}\n\nexport function listSkillsAction(factoryDir: string): void {\n const skills = listSkills(factoryDir);\n\n if (skills.length === 0) {\n console.log(\" No skills available.\");\n return;\n }\n\n header(\"Skills\");\n for (const skill of skills) {\n const desc = skill.description ? ` — ${skill.description}` : \"\";\n console.log(` ${skill.name} [${skill.source}]${desc}`);\n }\n}\n\nexport function listHooksAction(factoryDir: string): void {\n const allHooks = listHooks(factoryDir);\n let hasAny = false;\n\n for (const event of Object.keys(allHooks)) {\n const hooks = allHooks[event as keyof typeof allHooks];\n if (hooks && hooks.length > 0) {\n hasAny = true;\n }\n }\n\n if (!hasAny) {\n console.log(\" No hooks configured.\");\n return;\n }\n\n header(\"Hooks\");\n for (const event of Object.keys(allHooks)) {\n const hooks = allHooks[event as keyof typeof allHooks];\n if (!hooks || hooks.length === 0) continue;\n\n console.log(` ${event}:`);\n for (const hook of hooks) {\n const type = hook.command\n ? `cmd: ${hook.command}`\n : hook.skill\n ? `skill: ${hook.skill}`\n : hook.webhook\n ? `webhook: ${hook.webhook}`\n : \"unknown\";\n console.log(` ${hook.name} (${type}) [${hook.source}]`);\n }\n }\n}\n\nexport function listPresetsAction(): void {\n header(\"Pipeline Presets\");\n for (const name of listPresets()) {\n const preset = getPreset(name);\n console.log(` ${name} — ${preset.description}`);\n }\n}\n\nexport const listCommand = new Command(\"list\")\n .description(\"List installed extensions and resources\")\n .addCommand(\n new Command(\"plugins\")\n .description(\"List installed plugins\")\n .action(() => {\n listPluginsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"mcps\")\n .description(\"List configured MCP servers\")\n .action(() => {\n listMcpsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"skills\")\n .description(\"List available skills\")\n .action(() => {\n listSkillsAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"hooks\")\n .description(\"List configured hooks\")\n .action(() => {\n listHooksAction(resolve(\".\"));\n })\n )\n .addCommand(\n new Command(\"presets\")\n .description(\"List available pipeline presets\")\n .action(() => {\n listPresetsAction();\n })\n );\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"fs\";\nimport { resolve, join } from \"path\";\nimport { runImportAdapter } from \"../../engine/import-adapter.js\";\nimport { success, error, info, header } from \"../utils/display.js\";\n\nconst VALID_ARTIFACTS = [\"nlspec\", \"plan\", \"scenarios\"] as const;\ntype ImportArtifact = typeof VALID_ARTIFACTS[number];\n\nfunction createArtifactCommand(artifact: ImportArtifact): Command {\n return new Command(artifact)\n .description(`Import external document as ${artifact}`)\n .requiredOption(\"--from <path>\", \"Path to source file\")\n .requiredOption(\"--adapter <id>\", \"Adapter ID (e.g., generic:prd, bmad:brainstorm)\")\n .option(\"--output <path>\", \"Output path (default: stdout)\")\n .action((opts) => {\n try {\n const sourcePath = resolve(opts.from);\n if (!existsSync(sourcePath)) {\n throw new Error(`Source file not found: ${sourcePath}`);\n }\n\n const sourceContent = readFileSync(sourcePath, \"utf-8\");\n const result = runImportAdapter(opts.adapter, sourceContent);\n\n if (opts.output) {\n const outputPath = resolve(opts.output);\n\n // For scenarios adapter, result is JSON array of {name, content}\n if (artifact === \"scenarios\" && opts.adapter.endsWith(\":test-cases\")) {\n const scenarios = JSON.parse(result);\n mkdirSync(outputPath, { recursive: true });\n for (const scenario of scenarios) {\n const filePath = join(outputPath, `${scenario.name}.md`);\n writeFileSync(filePath, scenario.content, \"utf-8\");\n success(` ${scenario.name}.md`);\n }\n header(`Imported ${scenarios.length} scenarios to ${opts.output}`);\n } else {\n writeFileSync(outputPath, result, \"utf-8\");\n header(`Imported ${artifact}`);\n success(`Written to: ${opts.output}`);\n }\n } else {\n // Output to stdout\n process.stdout.write(result);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n}\n\nexport const importCommand = new Command(\"import\")\n .description(\"Import external artifacts into BeastMode format\");\n\nfor (const artifact of VALID_ARTIFACTS) {\n importCommand.addCommand(createArtifactCommand(artifact));\n}\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, readdirSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { join, resolve } from \"path\";\nimport { collectStatus } from \"../../engine/status-checker.js\";\nimport { FactoryIdentitySchema } from \"../../engine/schemas.js\";\nimport type { FactoryStatus, StatusInput } from \"../../engine/status-checker.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\n\n/**\n * Core action logic — exported for testing.\n * Reads factory files and returns a FactoryStatus object.\n */\nexport function statusAction(\n factoryDir: string,\n opts: { json: boolean }\n): FactoryStatus {\n const bmDir = join(factoryDir, \".beastmode\");\n\n if (!existsSync(bmDir)) {\n throw new Error(`No factory found at ${factoryDir}`);\n }\n\n // Read factory identity\n const factoryJsonPath = join(bmDir, \"factory.json\");\n const rawIdentity = JSON.parse(readFileSync(factoryJsonPath, \"utf-8\"));\n const factoryIdentity = FactoryIdentitySchema.parse(rawIdentity);\n\n // Count projects\n const projectsDir = join(bmDir, \"projects\");\n const projectCount = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\")).length\n : 0;\n\n // Count plugins\n const pluginsDir = join(bmDir, \"plugins\");\n const pluginNames = existsSync(pluginsDir) ? readdirSync(pluginsDir) : [];\n\n // Count MCP servers\n const mcpPath = join(bmDir, \"mcp-servers.json\");\n let mcpServers: Record<string, unknown> = {};\n if (existsSync(mcpPath)) {\n try {\n const raw = JSON.parse(readFileSync(mcpPath, \"utf-8\"));\n mcpServers = raw.servers || {};\n } catch {\n // ignore parse errors\n }\n }\n\n // Count hooks\n const hooksPath = join(bmDir, \"hooks.json\");\n let hooks: Record<string, unknown[]> = {};\n if (existsSync(hooksPath)) {\n try {\n const raw = JSON.parse(readFileSync(hooksPath, \"utf-8\"));\n hooks = raw.hooks || {};\n } catch {\n // ignore parse errors\n }\n }\n\n // Count skills\n const skillsDir = join(bmDir, \"skills\");\n const skillCount = existsSync(skillsDir)\n ? readdirSync(skillsDir).length\n : 0;\n\n // Find runs\n const runsDir = join(factoryDir, \"runs\");\n let runDirs: string[] = [];\n if (existsSync(runsDir)) {\n runDirs = readdirSync(runsDir)\n .filter((d) => d.startsWith(\"run-\"))\n .sort();\n }\n\n // Check daemon PID — PID file first, then process detection fallback\n const pidPath = join(bmDir, \"daemon.pid\");\n let daemonPid: number | null = null;\n let pidAlive = false;\n if (existsSync(pidPath)) {\n try {\n daemonPid = parseInt(readFileSync(pidPath, \"utf-8\").trim(), 10);\n process.kill(daemonPid, 0);\n pidAlive = true;\n } catch {\n pidAlive = false;\n }\n }\n // Fallback: detect daemon running via systemd or direct process\n if (!pidAlive) {\n try {\n const out = execSync(\"pgrep -f 'beastmode_daemon' 2>/dev/null || true\", {\n encoding: \"utf-8\",\n timeout: 3000,\n }).trim();\n if (out) {\n const pids = out.split(\"\\n\").map(p => parseInt(p, 10)).filter(p => !isNaN(p) && p > 0);\n if (pids.length > 0) {\n daemonPid = pids[0];\n pidAlive = true;\n }\n }\n } catch {\n // pgrep not available or timed out\n }\n }\n\n const input: StatusInput = {\n factoryIdentity,\n projectCount,\n pluginNames,\n mcpServers,\n hooks,\n skillCount,\n runDirs,\n daemonPid,\n pidAlive,\n };\n\n return collectStatus(input);\n}\n\nexport const statusCommand = new Command(\"status\")\n .description(\"Show factory status overview\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--watch\", \"Enable watch mode (display layer)\")\n .action((opts) => {\n const factoryDir = resolve(\".\");\n try {\n const status = statusAction(factoryDir, { json: !!opts.json });\n\n if (opts.json) {\n console.log(JSON.stringify(status, null, 2));\n return;\n }\n\n header(\"Factory Status\");\n console.log();\n info(`Factory: ${status.factory_name}`);\n info(`Engine: ${status.engine_version} (schema v${status.schema_version})`);\n info(`Created: ${status.created_at.split(\"T\")[0]}`);\n console.log();\n info(\"Resources:\");\n info(` Projects ${status.counts.projects}`);\n info(` Plugins ${status.counts.plugins}`);\n info(` MCPs ${status.counts.mcps}`);\n info(` Skills ${status.counts.skills}`);\n info(` Hooks ${status.counts.hooks}`);\n console.log();\n info(\n `Last Run: ${status.last_run ? status.last_run.run_id : \"none\"}`\n );\n info(`Daemon: ${status.daemon.status}`);\n\n if (opts.watch) {\n info(\"(watch mode — re-run to refresh)\");\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { configGet, configSet, configReset, coerceValue } from \"../../engine/config-manager.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\nimport { execSync } from \"child_process\";\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"No config.json found. Run beastmode init first.\");\n }\n return JSON.parse(readFileSync(configPath, \"utf-8\"));\n}\n\nfunction writeConfig(factoryDir: string, config: Record<string, unknown>): void {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n}\n\n/**\n * Get a config value by dot-notation key. Exported for testing.\n */\nexport function configGetAction(factoryDir: string, key: string): unknown {\n const config = readConfig(factoryDir);\n return configGet(config, key);\n}\n\n/**\n * Set a config value by dot-notation key. Exported for testing.\n */\nexport function configSetAction(factoryDir: string, key: string, rawValue: string): void {\n const config = readConfig(factoryDir);\n const value = coerceValue(rawValue);\n const updated = configSet(config, key, value);\n writeConfig(factoryDir, updated);\n}\n\n/**\n * Reset config to defaults. If key provided, reset only that key.\n */\nexport function configResetAction(factoryDir: string, key?: string): void {\n const config = readConfig(factoryDir);\n const updated = configReset(config, key);\n writeConfig(factoryDir, updated);\n}\n\nconst configGetCmd = new Command(\"get\")\n .description(\"Get a config value by dot-notation key\")\n .argument(\"<key>\", \"Config key (e.g., pipeline.preset)\")\n .action((key) => {\n const factoryDir = resolve(\".\");\n try {\n const value = configGetAction(factoryDir, key);\n if (typeof value === \"object\" && value !== null) {\n console.log(JSON.stringify(value, null, 2));\n } else {\n console.log(value);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nconst configSetCmd = new Command(\"set\")\n .description(\"Set a config value by dot-notation key\")\n .argument(\"<key>\", \"Config key (e.g., pipeline.preset)\")\n .argument(\"<value>\", \"Value to set (auto-coerces types)\")\n .action((key, value) => {\n const factoryDir = resolve(\".\");\n try {\n configSetAction(factoryDir, key, value);\n success(`Set ${key} = ${value}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nconst configEditCmd = new Command(\"edit\")\n .description(\"Open config.json in $EDITOR\")\n .action(() => {\n const factoryDir = resolve(\".\");\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(configPath)) {\n error(\"No config.json found. Run beastmode init first.\");\n process.exit(1);\n }\n const editor = process.env.EDITOR || \"vi\";\n try {\n execSync(`${editor} ${configPath}`, { stdio: \"inherit\" });\n } catch {\n error(`Failed to open editor: ${editor}`);\n process.exit(1);\n }\n });\n\nconst configResetCmd = new Command(\"reset\")\n .description(\"Reset config to defaults (all or specific key)\")\n .argument(\"[key]\", \"Optional key to reset (resets all if omitted)\")\n .action((key) => {\n const factoryDir = resolve(\".\");\n try {\n configResetAction(factoryDir, key);\n if (key) {\n success(`Reset ${key} to default`);\n } else {\n success(\"Reset all config to defaults\");\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\nexport const configCommand = new Command(\"config\")\n .description(\"Manage factory configuration\")\n .addCommand(configGetCmd)\n .addCommand(configSetCmd)\n .addCommand(configEditCmd)\n .addCommand(configResetCmd);\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, readdirSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { execSync, spawnSync } from \"child_process\";\nimport { homedir, platform } from \"os\";\nimport * as http from \"http\";\nimport * as https from \"https\";\nimport { runDiagnostics } from \"../../engine/doctor.js\";\nimport { FactoryIdentitySchema, FactoryConfigSchema } from \"../../engine/schemas.js\";\nimport { ENGINE_VERSION } from \"../../engine/version.js\";\nimport { checkEngineCompat } from \"../../engine/plugin-resolver.js\";\nimport type { DoctorInput, DoctorReport } from \"../../engine/doctor.js\";\nimport { header, success, warn, error, info } from \"../utils/display.js\";\nimport { isGhcrAuthenticated } from \"../utils/docker.js\";\nimport { createConnection } from \"net\";\nimport { findFactoryDir } from \"./board.js\";\n\n// ── Unused import kept for compat: checkEngineCompat is referenced by name ──\nvoid checkEngineCompat;\n\nfunction isPortInUse(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const socket = createConnection({ port, host: \"127.0.0.1\" });\n socket.once(\"connect\", () => {\n socket.destroy();\n resolve(true);\n });\n socket.once(\"error\", () => {\n resolve(false);\n });\n });\n}\n\ninterface CheckResult {\n label: string;\n status: \"pass\" | \"fail\" | \"warn\" | \"info\";\n detail: string;\n fix?: string;\n}\n\nfunction tryExec(cmd: string, timeout = 8000): string | null {\n try {\n return execSync(cmd, { encoding: \"utf-8\", timeout, stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n } catch {\n return null;\n }\n}\n\n/** HTTP GET — resolves with status code or null on error */\nfunction httpGet(url: string, timeoutMs = 5000): Promise<number | null> {\n return new Promise((resolve) => {\n const lib = url.startsWith(\"https\") ? https : http;\n const req = lib.get(url, { timeout: timeoutMs }, (res) => {\n res.resume(); // consume body\n resolve(res.statusCode ?? null);\n });\n req.on(\"error\", () => resolve(null));\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\n/** Check Claude AI auth — Claude Code CLI (subscription) or ANTHROPIC_API_KEY */\nasync function checkClaudeAuth(key: string | undefined): Promise<CheckResult[]> {\n const results: CheckResult[] = [];\n\n // Check Claude Code CLI auth (primary)\n const claudeInstalled = tryExec(\"claude --version 2>/dev/null\");\n if (claudeInstalled) {\n results.push({ label: \"Claude Code CLI\", status: \"pass\", detail: `installed (${claudeInstalled}) — primary AI auth` });\n } else {\n results.push({\n label: \"Claude Code CLI\",\n status: \"warn\",\n detail: \"not found — install for subscription auth\",\n fix: \"npm install -g @anthropic-ai/claude-code && claude login\",\n });\n }\n\n // macOS + Docker: check if creds file exists for container auth\n if (claudeInstalled && platform() === \"darwin\" && !key) {\n const credsPath = join(homedir(), \".claude\", \".credentials.json\");\n if (!existsSync(credsPath)) {\n results.push({\n label: \"Claude creds (Docker)\",\n status: \"warn\",\n detail: \"~/.claude/.credentials.json missing — Docker containers can't auth on macOS (Keychain not reachable)\",\n fix: \"beastmode sync-claude-creds --install (skip if not using Docker Compose or ANTHROPIC_API_KEY is set)\",\n });\n } else {\n results.push({ label: \"Claude creds (Docker)\", status: \"pass\", detail: \"~/.claude/.credentials.json present — Docker can auth\" });\n }\n }\n\n // Check ANTHROPIC_API_KEY (optional, faster direct API calls)\n if (!key) {\n if (claudeInstalled) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: \"not set (using Claude Code CLI — this is fine)\" });\n } else {\n results.push({\n label: \"ANTHROPIC_API_KEY\",\n status: \"fail\",\n detail: \"not set and Claude Code CLI not found — need at least one\",\n fix: \"Run `claude login` (recommended) or export ANTHROPIC_API_KEY=<your-key>\",\n });\n }\n return results;\n }\n\n // Key is set — validate it\n const payload = JSON.stringify({\n model: \"claude-haiku-4-5\",\n max_tokens: 1,\n messages: [{ role: \"user\", content: \"hi\" }],\n });\n\n const statusCode = await new Promise<number | null>((resolve) => {\n const req = https.request(\n {\n hostname: \"api.anthropic.com\",\n path: \"/v1/messages\",\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"anthropic-version\": \"2023-06-01\",\n \"x-api-key\": key,\n \"Content-Length\": Buffer.byteLength(payload),\n },\n timeout: 10000,\n },\n (res) => {\n res.resume();\n resolve(res.statusCode ?? null);\n }\n );\n req.on(\"error\", () => resolve(null));\n req.on(\"timeout\", () => {\n req.destroy();\n resolve(null);\n });\n req.write(payload);\n req.end();\n });\n\n if (statusCode === null) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"warn\", detail: \"set but API unreachable (network issue?)\" });\n } else if (statusCode === 200 || statusCode === 201) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: \"valid (enables faster direct API calls)\" });\n } else if (statusCode === 401 || statusCode === 403) {\n results.push({\n label: \"ANTHROPIC_API_KEY\",\n status: claudeInstalled ? \"warn\" : \"fail\",\n detail: `invalid (HTTP ${statusCode})`,\n fix: \"Check your API key at https://console.anthropic.com\",\n });\n } else if (statusCode === 429 || statusCode === 529) {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"pass\", detail: `set (HTTP ${statusCode} — rate limited, key appears valid)` });\n } else {\n results.push({ label: \"ANTHROPIC_API_KEY\", status: \"warn\", detail: `set but API returned HTTP ${statusCode}` });\n }\n\n return results;\n}\n\nfunction checkGithubToken(env: Record<string, string | undefined>): CheckResult {\n const token = env.GITHUB_TOKEN || env.GH_TOKEN;\n if (!token) {\n return {\n label: \"GITHUB_TOKEN / GH_TOKEN\",\n status: \"warn\",\n detail: \"not set\",\n fix: \"export GITHUB_TOKEN=<your-pat> or gh auth login\",\n };\n }\n\n // Validate with gh auth status\n const ghStatus = tryExec(\"gh auth status 2>&1\");\n if (ghStatus !== null && (ghStatus.includes(\"Logged in\") || ghStatus.includes(\"✓\"))) {\n return { label: \"GITHUB_TOKEN / GH_TOKEN\", status: \"pass\", detail: \"valid (gh auth ok)\" };\n }\n // gh might not be installed or token is set but gh doesn't know about it\n return { label: \"GITHUB_TOKEN / GH_TOKEN\", status: \"pass\", detail: \"set\" };\n}\n\n/**\n * Gap 16 — validate PROJECT_GITHUB_TOKEN against the actual project\n * repo's permissions. Reads the env var (with backward-compat fallback\n * to GITHUB_TOKEN), reads PROJECT_DIR from the factory's .env, derives\n * the owner/repo from `git remote get-url origin`, then hits\n * api.github.com/repos/<owner>/<repo> with the token and verifies the\n * returned `permissions.push` is true.\n *\n * This is more thorough than the legacy checkGithubToken() — it not\n * only confirms the token is valid (any github.com PAT does that) but\n * specifically that it has WRITE access to the target repo, which is\n * what beastmode's merge phase actually needs.\n */\nasync function checkProjectGithubToken(\n env: Record<string, string | undefined>,\n factoryDir: string | null,\n): Promise<CheckResult> {\n const token = env.PROJECT_GITHUB_TOKEN || env.GITHUB_TOKEN;\n if (!token) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: \"not set in env (or factory .env)\",\n fix: \"Add PROJECT_GITHUB_TOKEN=ghp_... to .env (needs `repo` scope for private, `public_repo` for public)\",\n };\n }\n\n // Try to read PROJECT_DIR from the factory .env so we can derive\n // the target repo. If we can't, just confirm the token is valid\n // against api.github.com/user (less specific but better than nothing).\n let ownerRepo: string | null = null;\n if (factoryDir) {\n const envPath = join(factoryDir, \".env\");\n if (existsSync(envPath)) {\n try {\n const content = readFileSync(envPath, \"utf-8\");\n const dirLine = content.split(\"\\n\").find(\n (l) => l.trim().startsWith(\"PROJECT_DIR=\") && !l.trim().startsWith(\"#\"),\n );\n if (dirLine) {\n const projectDir = dirLine.split(\"=\").slice(1).join(\"=\").trim();\n if (projectDir && existsSync(join(projectDir, \".git\"))) {\n const remote = tryExec(\n `git -C \"${projectDir}\" remote get-url origin 2>/dev/null`,\n );\n if (remote) {\n // Parse owner/repo — same regex as project_repo.py\n const m = remote.match(\n /(?:https?:\\/\\/[^/]+\\/|git@[^:]+:)([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?\\/?$/,\n );\n if (m) ownerRepo = `${m[1]}/${m[2]}`;\n }\n }\n }\n } catch {\n // fall through\n }\n }\n }\n\n // Hit api.github.com/repos/<owner/repo> if we have one, otherwise /user\n const apiPath = ownerRepo ? `/repos/${ownerRepo}` : \"/user\";\n const result = await new Promise<{ status: number; canPush: boolean | null }>((resolveProm) => {\n const req = https.request(\n {\n hostname: \"api.github.com\",\n path: apiPath,\n method: \"GET\",\n headers: {\n \"User-Agent\": \"beastmode-doctor\",\n Authorization: `Bearer ${token}`,\n Accept: \"application/vnd.github+json\",\n },\n timeout: 8000,\n },\n (res) => {\n let data = \"\";\n res.on(\"data\", (chunk) => { data += chunk; });\n res.on(\"end\", () => {\n let canPush: boolean | null = null;\n try {\n const parsed = JSON.parse(data);\n if (parsed.permissions && typeof parsed.permissions.push === \"boolean\") {\n canPush = parsed.permissions.push;\n }\n } catch {\n // non-json response\n }\n resolveProm({ status: res.statusCode ?? 0, canPush });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: 0, canPush: null }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: 0, canPush: null });\n });\n req.end();\n });\n\n if (result.status === 0) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"warn\",\n detail: \"set but api.github.com unreachable (network issue?)\",\n };\n }\n if (result.status === 401 || result.status === 403) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `invalid (HTTP ${result.status}${ownerRepo ? ` for ${ownerRepo}` : \"\"})`,\n fix: \"Check the token at https://github.com/settings/tokens — needs `repo` scope (or `public_repo` for public repos only)\",\n };\n }\n if (result.status === 404 && ownerRepo) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `cannot access ${ownerRepo} (HTTP 404 — repo missing or token has no read permission)`,\n fix: \"Verify the token has access to the target repo + the repo URL is correct in PROJECT_DIR\",\n };\n }\n if (result.status >= 200 && result.status < 300) {\n if (ownerRepo && result.canPush === true) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"pass\",\n detail: `valid + write access to ${ownerRepo}`,\n };\n }\n if (ownerRepo && result.canPush === false) {\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"fail\",\n detail: `valid but NO write access to ${ownerRepo}`,\n fix: \"The token's user is not a collaborator on the target repo OR the token lacks `repo` scope\",\n };\n }\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"pass\",\n detail: ownerRepo\n ? `valid (couldn't determine permissions — repo response had no permissions field)`\n : `valid (skipped per-repo check — no PROJECT_DIR resolvable)`,\n };\n }\n return {\n label: \"PROJECT_GITHUB_TOKEN\",\n status: \"warn\",\n detail: `HTTP ${result.status}`,\n };\n}\n\n/**\n * Gap 16 — validate GHCR_PULL_TOKEN against the actual GHCR registry.\n * Reads the env var, attempts a `docker manifest inspect` against\n * ghcr.io/develeap/beastmode/board:latest. If it succeeds, the token\n * has read:packages scope and can pull beastmode images. If it fails,\n * the token is missing the scope (or wrong, or the registry is down).\n */\nfunction checkGhcrPullToken(\n env: Record<string, string | undefined>,\n): CheckResult {\n const token = env.GHCR_PULL_TOKEN;\n if (!token) {\n // Falls back to the project token in init.ts. Surface this as a\n // soft warning, not a hard fail — users may have only one PAT.\n if (env.GITHUB_TOKEN || env.PROJECT_GITHUB_TOKEN) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: \"not set; falling back to PROJECT_GITHUB_TOKEN (works if it has read:packages scope)\",\n fix: \"Set GHCR_PULL_TOKEN=ghp_... in .env for a dedicated read-only token (read:packages scope)\",\n };\n }\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"fail\",\n detail: \"not set — `docker compose pull` cannot fetch private beastmode images\",\n fix: \"Set GHCR_PULL_TOKEN=ghp_... in .env (read:packages scope)\",\n };\n }\n\n // Try `docker manifest inspect` with the token. If docker is logged\n // in to ghcr.io with this token already, this just works. If not,\n // we'd need to do `docker login ghcr.io` first — which would change\n // global docker state, which is too aggressive for a check. So we\n // inspect the existing login state via `docker login --get-login`\n // and report whichever way the credential currently is.\n const loggedIn = tryExec(\"docker login ghcr.io --get-login 2>/dev/null\");\n if (!loggedIn) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: \"set in env but docker is not logged in to ghcr.io\",\n fix: \"Run `docker login ghcr.io -u <github-username> --password-stdin <<< $GHCR_PULL_TOKEN`\",\n };\n }\n // Try the actual pull-permission check\n const inspect = tryExec(\n \"docker manifest inspect ghcr.io/develeap/beastmode/board:latest 2>&1\",\n 15000,\n );\n if (inspect && (inspect.includes(\"schemaVersion\") || inspect.includes(\"mediaType\"))) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"pass\",\n detail: `valid (logged in as ${loggedIn}, can pull beastmode images)`,\n };\n }\n if (inspect && inspect.includes(\"denied\")) {\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"fail\",\n detail: \"logged in but lacks read:packages scope (denied)\",\n fix: \"Generate a new PAT at https://github.com/settings/tokens with `read:packages` scope\",\n };\n }\n return {\n label: \"GHCR_PULL_TOKEN\",\n status: \"warn\",\n detail: `logged in as ${loggedIn} but image inspect didn't return a manifest`,\n };\n}\n\nfunction checkDocker(): CheckResult {\n const out = tryExec(\"docker info --format '{{.ServerVersion}}' 2>/dev/null\");\n if (out) {\n return { label: \"Docker\", status: \"pass\", detail: `running (v${out})` };\n }\n // Try docker version as fallback\n const ver = tryExec(\"docker version --format '{{.Server.Version}}' 2>/dev/null\");\n if (ver) {\n return { label: \"Docker\", status: \"pass\", detail: `running (v${ver})` };\n }\n return {\n label: \"Docker\",\n status: \"warn\",\n detail: \"not running or not installed\",\n fix: \"Install Docker Desktop or start the Docker daemon\",\n };\n}\n\n/**\n * Check Docker Compose is v2.0 or newer. Compose v1 is end-of-life and\n * doesn't support the `${VAR:?error}` syntax beastmode's generated\n * docker-compose.yml uses for the PROJECT_DIR guard (Gap 1).\n */\nfunction checkDockerComposeVersion(): CheckResult {\n // `docker compose version` (no hyphen — plugin form) is the modern\n // command. `docker-compose version` (hyphen — standalone) is the\n // legacy v1 command.\n const v2 = tryExec(\"docker compose version --short 2>/dev/null\");\n if (v2) {\n const major = parseInt(v2.split(\".\")[0], 10);\n if (!isNaN(major) && major >= 2) {\n return {\n label: \"Docker Compose\",\n status: \"pass\",\n detail: `v${v2} (plugin)`,\n };\n }\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: `v${v2} — need v2.0 or newer`,\n fix: \"Update Docker Desktop to the latest version\",\n };\n }\n\n // Fallback: check for legacy docker-compose v1\n const v1 = tryExec(\"docker-compose version --short 2>/dev/null\");\n if (v1) {\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: `legacy v${v1} — beastmode requires v2.0+ (plugin form)`,\n fix: \"Install Docker Compose v2 (bundled with modern Docker Desktop)\",\n };\n }\n\n return {\n label: \"Docker Compose\",\n status: \"fail\",\n detail: \"not installed\",\n fix: \"Install Docker Compose v2 (bundled with Docker Desktop)\",\n };\n}\n\n/**\n * Check PROJECT_DIR (from .env in the factory dir) points at a valid\n * git repo with an origin remote. This is Gap 1's acceptance criterion —\n * without it, the daemon's merge-phase code can't resolve the target\n * github repo, which is the bug that cost Story 1 ~30 minutes of\n * pipeline work today.\n */\nfunction checkProjectDirEnv(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"warn\",\n detail: \"no factory in scope\",\n };\n }\n\n const envPath = join(factoryDir, \".env\");\n if (!existsSync(envPath)) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `.env not found at ${envPath}`,\n fix: \"Run `beastmode init` in this directory to generate .env\",\n };\n }\n\n let content: string;\n try {\n content = readFileSync(envPath, \"utf-8\");\n } catch {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \".env unreadable\",\n };\n }\n\n const lines = content.split(\"\\n\");\n const line = lines.find(\n (l) => l.trim().startsWith(\"PROJECT_DIR=\") && !l.trim().startsWith(\"#\"),\n );\n if (!line) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \"PROJECT_DIR not set (or commented out)\",\n fix: \"Re-run `beastmode init --project <path>` to populate it\",\n };\n }\n\n const value = line.split(\"=\").slice(1).join(\"=\").trim();\n if (!value) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: \"PROJECT_DIR is empty\",\n fix: \"Re-run `beastmode init --project <path>` to populate it\",\n };\n }\n\n if (!existsSync(value)) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `PROJECT_DIR=${value} does not exist`,\n fix: `Clone your project to ${value} or re-run 'beastmode init --project <path>'`,\n };\n }\n\n if (!existsSync(join(value, \".git\"))) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"fail\",\n detail: `PROJECT_DIR=${value} is not a git repo`,\n fix: \"Run `git init` in the project dir, or point PROJECT_DIR at an existing git clone\",\n };\n }\n\n // Check origin remote — Gap 2 auto-resolve needs this to work\n const remote = tryExec(`git -C \"${value}\" remote get-url origin 2>/dev/null`);\n if (!remote) {\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"warn\",\n detail: `${value} has no origin remote — daemon can't auto-resolve github repo (Gap 2)`,\n fix: `cd ${value} && git remote add origin <url>, or set PROJECT_REPO in .env as a last-resort override`,\n };\n }\n\n return {\n label: \"PROJECT_DIR (.env)\",\n status: \"pass\",\n detail: `${value} (origin: ${remote})`,\n };\n}\n\n/**\n * Check factory compose services are running and healthy. Without this,\n * doctor can't distinguish \"factory was never started\" from \"factory is\n * broken at runtime\". Uses `docker compose ps --format json` which\n * requires Compose v2.\n */\nasync function checkFactoryContainers(\n factoryDir: string | null,\n): Promise<CheckResult> {\n if (!factoryDir) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no factory in scope\",\n };\n }\n\n const composePath = join(factoryDir, \"docker-compose.yml\");\n if (!existsSync(composePath)) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no docker-compose.yml in factory\",\n fix: \"Run `beastmode init` to generate one\",\n };\n }\n\n // `docker compose ps --format json` emits one JSON per line (jsonlines).\n // Each line is { Service, Name, State, Health, ... }.\n const out = tryExec(\n `docker compose -f \"${composePath}\" --project-directory \"${factoryDir}\" ps --format json 2>/dev/null`,\n 15000,\n );\n if (out === null) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"docker compose ps failed — factory may be down\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n if (!out.trim()) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"no containers running\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const rows: Array<{\n Service?: string;\n Name?: string;\n State?: string;\n Health?: string;\n }> = [];\n for (const line of out.split(\"\\n\")) {\n const t = line.trim();\n if (!t) continue;\n try {\n const parsed = JSON.parse(t);\n if (Array.isArray(parsed)) {\n for (const p of parsed) rows.push(p);\n } else {\n rows.push(parsed);\n }\n } catch {\n // skip\n }\n }\n\n if (rows.length === 0) {\n return {\n label: \"Factory containers\",\n status: \"warn\",\n detail: \"docker compose ps output not parseable\",\n };\n }\n\n const required = [\"board\", \"ui\", \"daemon\"];\n const byService = new Map<string, { state?: string; health?: string; name?: string }>();\n for (const r of rows) {\n if (r.Service) {\n byService.set(r.Service, {\n state: r.State,\n health: r.Health,\n name: r.Name,\n });\n }\n }\n\n const missing = required.filter((s) => !byService.has(s));\n if (missing.length > 0) {\n return {\n label: \"Factory containers\",\n status: \"fail\",\n detail: `missing services: ${missing.join(\", \")}`,\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const unhealthy: string[] = [];\n for (const svc of required) {\n const info = byService.get(svc);\n if (!info) continue;\n if (info.state !== \"running\") {\n unhealthy.push(`${svc}(${info.state})`);\n } else if (info.health && info.health !== \"healthy\" && info.health !== \"\") {\n unhealthy.push(`${svc}(${info.health})`);\n }\n }\n\n if (unhealthy.length > 0) {\n return {\n label: \"Factory containers\",\n status: \"fail\",\n detail: `unhealthy: ${unhealthy.join(\", \")}`,\n fix: \"Check `docker compose logs <service>` for the unhealthy container\",\n };\n }\n\n return {\n label: \"Factory containers\",\n status: \"pass\",\n detail: `${required.join(\", \")} running & healthy`,\n };\n}\n\n/**\n * Check the UI container actually serves /board with 200. This catches\n * the class of bug where containers are \"running\" per compose but the\n * Node process crashed after startup, or where the board.html file is\n * missing from the image.\n */\nasync function checkUiServesBoard(): Promise<CheckResult> {\n // Try the default UI port 8420 first — matches what the template\n // ships. Fall back to 8080 (legacy) and 3000 (beastmode init wizard).\n const ports = [8420, 8080, 3000];\n for (const port of ports) {\n const code = await httpGet(`http://127.0.0.1:${port}/board`, 3000);\n if (code !== null && code >= 200 && code < 400) {\n return {\n label: \"UI /board endpoint\",\n status: \"pass\",\n detail: `http://127.0.0.1:${port}/board → ${code}`,\n };\n }\n }\n return {\n label: \"UI /board endpoint\",\n status: \"warn\",\n detail: \"no UI server responding to /board on 8420, 8080, or 3000\",\n fix: \"Check `docker compose logs ui` — the Node process may have crashed after startup\",\n };\n}\n\n/**\n * Check the daemon container can actually load its config and resolve\n * the project repo (Gap 2 auto-resolver). Runs `python -c \"...\"` inside\n * the daemon container and parses the output. Catches the Story 1-class\n * bug 30 minutes earlier: if project_repo is unresolvable, the user\n * sees it here instead of at merge time.\n */\nfunction checkDaemonConfigLoad(): CheckResult {\n // Find the daemon container by compose service label. If we're not\n // in a factory dir, skip (requires a running factory).\n const container = tryExec(\n `docker ps --filter 'label=com.docker.compose.service=daemon' --format '{{.Names}}' 2>/dev/null | head -n1`,\n );\n if (!container) {\n return {\n label: \"Daemon config\",\n status: \"warn\",\n detail: \"no daemon container running\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const pyScript = `\nfrom beastmode_daemon.config import DaemonConfig\ntry:\n c = DaemonConfig.load()\n errors = c.validate_for_startup()\n print('REPO=' + (c.github.project_repo or ''))\n print('DIR=' + str(c.project_dir or ''))\n print('ERRORS=' + ('; '.join(errors) if errors else 'none'))\nexcept Exception as e:\n print('EXC=' + type(e).__name__ + ': ' + str(e))\n `.trim();\n\n const out = tryExec(\n `docker exec ${container} python -c \"${pyScript.replace(/\"/g, '\\\\\"')}\" 2>/dev/null`,\n 12000,\n );\n if (!out) {\n return {\n label: \"Daemon config\",\n status: \"warn\",\n detail: `could not execute python inside ${container}`,\n };\n }\n\n const lines = out.split(\"\\n\");\n const repo = lines.find((l) => l.startsWith(\"REPO=\"))?.slice(5) ?? \"\";\n const dir = lines.find((l) => l.startsWith(\"DIR=\"))?.slice(4) ?? \"\";\n const errors = lines.find((l) => l.startsWith(\"ERRORS=\"))?.slice(7) ?? \"\";\n const exc = lines.find((l) => l.startsWith(\"EXC=\"))?.slice(4) ?? \"\";\n\n if (exc) {\n return {\n label: \"Daemon config\",\n status: \"fail\",\n detail: `exception: ${exc}`,\n fix: \"Check docker logs + daemon/beastmode_daemon/config.py\",\n };\n }\n\n if (errors && errors !== \"none\") {\n return {\n label: \"Daemon config\",\n status: \"fail\",\n detail: errors,\n fix: \"See docs/zero-to-productive-readiness.md Gap 2\",\n };\n }\n\n return {\n label: \"Daemon config\",\n status: \"pass\",\n detail: `repo=${repo || \"<empty>\"}, dir=${dir || \"<empty>\"}`,\n };\n}\n\nexport function checkBoardDbIntegrity(): CheckResult {\n const container = tryExec(\n `docker ps --filter 'label=com.docker.compose.service=board' --format '{{.Names}}' 2>/dev/null | head -n1`,\n );\n if (!container) {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: \"no board container running — skipped\",\n fix: \"Run `docker compose up -d` in the factory directory\",\n };\n }\n\n const pyScript = `\nimport sqlite3, glob, os\npaths = sorted(glob.glob('/app/data/*.db') + glob.glob('/app/data/boards/*.db'))\nif not paths:\n print('NONE')\nelse:\n for p in paths:\n try:\n c = sqlite3.connect(p)\n r = c.execute('PRAGMA integrity_check').fetchone()\n c.close()\n status = r[0] if r else 'unknown'\n except Exception as e:\n status = 'err:' + type(e).__name__\n print(os.path.relpath(p, '/app/data') + '|' + status)\n `.trim();\n\n const out = tryExec(\n `docker exec ${container} python3 -c \"${pyScript.replace(/\"/g, '\\\\\"')}\" 2>/dev/null`,\n 15000,\n );\n if (!out) {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: `could not execute python inside ${container}`,\n };\n }\n\n if (out.trim() === \"NONE\") {\n return {\n label: \"Board DB integrity\",\n status: \"warn\",\n detail: \"no .db files found under /app/data/ or /app/data/boards/\",\n };\n }\n\n const lines = out.split(\"\\n\").map((l) => l.trim()).filter(Boolean);\n const bad: string[] = [];\n const good: string[] = [];\n for (const line of lines) {\n const [path, status] = line.split(\"|\");\n if (!path || !status) continue;\n if (status === \"ok\") {\n good.push(path);\n } else {\n bad.push(`${path}: ${status}`);\n }\n }\n\n if (bad.length > 0) {\n return {\n label: \"Board DB integrity\",\n status: \"fail\",\n detail: `${bad.length} corrupted db(s): ${bad.join(\"; \")}`,\n fix: \"Stop the factory (`docker compose down`), restore the most recent clean backup from /app/data/.gap24-backup-*, or run `sqlite3 <db> 'REINDEX;'` inside the board container. See Gap 24 in docs/zero-to-productive-readiness.md\",\n };\n }\n\n return {\n label: \"Board DB integrity\",\n status: \"pass\",\n detail: `${good.length} db(s) ok (${good.join(\", \")})`,\n };\n}\n\nexport function checkGhcrAuth(): CheckResult {\n if (isGhcrAuthenticated()) {\n return {\n label: \"GHCR (ghcr.io)\",\n status: \"pass\",\n detail: \"authenticated — can pull BeastMode images\",\n };\n }\n return {\n label: \"GHCR (ghcr.io)\",\n status: \"warn\",\n detail: \"not authenticated — cannot pull BeastMode images\",\n fix: \"docker login ghcr.io -u <github-username> (use PAT with read:packages scope)\",\n };\n}\n\nfunction checkClaudeCode(): CheckResult {\n const out = tryExec(\"claude --version 2>/dev/null\");\n if (out) {\n return { label: \"Claude Code CLI\", status: \"pass\", detail: `installed (${out})` };\n }\n return {\n label: \"Claude Code CLI\",\n status: \"fail\",\n detail: \"not found\",\n fix: \"npm install -g @anthropic-ai/claude-code\",\n };\n}\n\nfunction checkGitHubCli(): CheckResult {\n const out = tryExec(\"gh --version 2>/dev/null\");\n if (out) {\n const firstLine = out.split(\"\\n\")[0].trim();\n return { label: \"GitHub CLI\", status: \"pass\", detail: `installed (${firstLine})` };\n }\n return {\n label: \"GitHub CLI\",\n status: \"fail\",\n detail: \"not found\",\n fix: \"brew install gh (macOS) or see https://cli.github.com\",\n };\n}\n\nfunction checkProjectDirectory(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no factory found in current directory tree\",\n fix: \"Run beastmode init to create a factory\",\n };\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n const projectsDir = join(bmDir, \"projects\");\n\n if (!existsSync(projectsDir)) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no projects configured\",\n fix: \"Run: beastmode add project <path>\",\n };\n }\n\n const projectFiles = existsSync(projectsDir)\n ? readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"))\n : [];\n\n if (projectFiles.length === 0) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: \"no projects configured\",\n fix: \"Run: beastmode add project <path>\",\n };\n }\n\n const results: string[] = [];\n let anyFail = false;\n\n for (const file of projectFiles) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n const projPath: string = proj.path || \"\";\n const projName: string = proj.name || file.replace(\".json\", \"\");\n\n if (!projPath || !existsSync(projPath)) {\n results.push(`${projName}: path not found`);\n anyFail = true;\n continue;\n }\n\n const isGit = existsSync(join(projPath, \".git\"));\n const manifests = [\n \"package.json\", \"Cargo.toml\", \"go.mod\", \"pyproject.toml\",\n \"requirements.txt\", \"pom.xml\", \"build.gradle\", \"build.gradle.kts\",\n ];\n const manifest = manifests.find((m) => existsSync(join(projPath, m)));\n const framework = proj.stack?.detected || manifest?.replace(\".json\", \"\") || \"unknown\";\n\n results.push(\n `${projName}: ${projPath} (${framework})${isGit ? \"\" : \" [no .git]\"}`\n );\n if (!isGit) anyFail = true;\n } catch {\n results.push(`${file}: unreadable`);\n anyFail = true;\n }\n }\n\n if (anyFail) {\n return {\n label: \"Project directory\",\n status: \"warn\",\n detail: results.join(\"; \"),\n fix: \"Check project paths with: beastmode doctor\",\n };\n }\n\n return {\n label: \"Project directory\",\n status: \"pass\",\n detail: results.join(\"; \"),\n };\n}\n\nasync function checkBoardServer(factoryDir: string | null): Promise<CheckResult> {\n // Default board port — check common ports\n const ports = [7669, 8080, 8420, 3000];\n const host = \"127.0.0.1\";\n\n for (const port of ports) {\n const url = `http://${host}:${port}`;\n const code = await httpGet(url, 3000);\n if (code !== null && code < 500) {\n return {\n label: \"Board server\",\n status: \"pass\",\n detail: `${url} — ${code} OK`,\n };\n }\n }\n\n return {\n label: \"Board server\",\n status: \"warn\",\n detail: \"not reachable on localhost:7669, 8080, 8420, or 3000\",\n fix: \"Start the board with: beastmode board\",\n };\n}\n\nfunction checkStack(factoryDir: string | null): CheckResult {\n if (!factoryDir) {\n return {\n label: \"Stack\",\n status: \"warn\",\n detail: \"no factory — run beastmode init\",\n };\n }\n\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) {\n return { label: \"Stack\", status: \"warn\", detail: \"no projects configured\" };\n }\n\n const projectFiles = readdirSync(projectsDir).filter((f) => f.endsWith(\".json\"));\n if (projectFiles.length === 0) {\n return { label: \"Stack\", status: \"warn\", detail: \"no projects configured\" };\n }\n\n const stacks: string[] = [];\n for (const file of projectFiles) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n const name: string = proj.name || file.replace(\".json\", \"\");\n const detected: string = proj.stack?.detected || \"unknown\";\n const build: string = proj.stack?.build_command || \"\";\n const port: number = proj.stack?.dev_port || 3000;\n stacks.push(`${name}: ${detected} — ${build}, port ${port}`);\n } catch {\n // skip unreadable\n }\n }\n\n if (stacks.length === 0) {\n return { label: \"Stack\", status: \"warn\", detail: \"no readable project configs\" };\n }\n\n return { label: \"Stack\", status: \"pass\", detail: stacks.join(\" | \") };\n}\n\nfunction checkPlaywright(): CheckResult {\n const out = tryExec(\"npx playwright --version 2>/dev/null\");\n if (out) {\n return { label: \"Playwright\", status: \"pass\", detail: `installed (${out.trim()})` };\n }\n // Check if playwright is installed but chromium is missing\n const playwrightPkg = tryExec(\"npx playwright --version 2>&1\");\n if (playwrightPkg && playwrightPkg.includes(\"Version\")) {\n const chromiumPath = tryExec(\"npx playwright install --dry-run chromium 2>&1\");\n if (chromiumPath && chromiumPath.includes(\"chromium\")) {\n return {\n label: \"Playwright\",\n status: \"warn\",\n detail: \"installed but chromium may be missing\",\n fix: \"npx playwright install chromium\",\n };\n }\n }\n return {\n label: \"Playwright\",\n status: \"warn\",\n detail: \"not installed\",\n fix: \"npx playwright install chromium\",\n };\n}\n\nfunction checkBoardPassword(\n env: Record<string, string | undefined>,\n factoryDir: string | null\n): CheckResult {\n const envPassword = env.BEASTMODE_UI_PASSWORD;\n if (envPassword) {\n return { label: \"Board password\", status: \"pass\", detail: \"set\" };\n }\n\n // Check .env and secrets.env.local files\n if (factoryDir) {\n const dotEnv = join(factoryDir, \".env\");\n const secretsEnv = join(factoryDir, \".beastmode\", \"secrets.env.local\");\n\n for (const filePath of [dotEnv, secretsEnv]) {\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const lines = content.split(\"\\n\");\n const line = lines.find((l) => l.startsWith(\"BEASTMODE_UI_PASSWORD=\"));\n if (line) {\n const val = line.split(\"=\").slice(1).join(\"=\").trim();\n if (val) {\n return { label: \"Board password\", status: \"pass\", detail: \"set (in env file)\" };\n }\n }\n } catch {\n // skip unreadable\n }\n }\n }\n }\n\n return {\n label: \"Board password\",\n status: \"warn\",\n detail: \"BEASTMODE_UI_PASSWORD not set — board UI has no auth\",\n fix: \"export BEASTMODE_UI_PASSWORD=<password> or add to .beastmode/secrets.env.local\",\n };\n}\n\n/**\n * Core factory doctor action — exported for testing.\n * Gathers factory-level inputs and runs engine diagnostics.\n */\nexport function doctorAction(\n factoryDir: string,\n env: Record<string, string | undefined>\n): DoctorReport {\n const bmDir = join(factoryDir, \".beastmode\");\n const factoryDirExists = existsSync(bmDir);\n\n // Read factory identity\n let factoryIdentity = null;\n if (factoryDirExists) {\n try {\n const raw = JSON.parse(readFileSync(join(bmDir, \"factory.json\"), \"utf-8\"));\n factoryIdentity = FactoryIdentitySchema.parse(raw);\n } catch {\n // identity missing or invalid\n }\n }\n\n // Read and validate config\n let config: Record<string, unknown> | null = null;\n let configParseError: string | null = null;\n if (factoryDirExists) {\n const configPath = join(bmDir, \"config.json\");\n if (existsSync(configPath)) {\n try {\n const raw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n const result = FactoryConfigSchema.safeParse(raw);\n if (result.success) {\n config = raw;\n } else {\n configParseError = result.error.issues\n .map((i) => `${i.path.join(\".\")}: ${i.message}`)\n .join(\", \");\n }\n } catch {\n configParseError = \"config.json is not valid JSON\";\n }\n } else {\n configParseError = \"config.json is missing\";\n }\n }\n\n // Read project paths\n const projectPaths: Array<{ name: string; path: string; exists: boolean }> = [];\n if (factoryDirExists) {\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n for (const file of readdirSync(projectsDir)) {\n if (file.endsWith(\".json\")) {\n try {\n const proj = JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"));\n if (proj.path) {\n projectPaths.push({\n name: proj.name || file.replace(\".json\", \"\"),\n path: proj.path,\n exists: existsSync(proj.path),\n });\n }\n } catch {\n // skip invalid project files\n }\n }\n }\n }\n }\n\n // Read installed plugins\n const installedPlugins: Array<{ name: string; engine_version: string }> = [];\n if (factoryDirExists) {\n const pluginsDir = join(bmDir, \"plugins\");\n if (existsSync(pluginsDir)) {\n for (const pluginName of readdirSync(pluginsDir)) {\n const manifestPath = join(pluginsDir, pluginName, \"manifest.json\");\n if (existsSync(manifestPath)) {\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\"));\n installedPlugins.push({\n name: pluginName,\n engine_version: manifest.engine_version || \"*\",\n });\n } catch {\n // skip invalid plugin manifests\n }\n }\n }\n }\n }\n\n const input: DoctorInput = {\n factoryDirExists,\n factoryIdentity,\n config,\n configParseError,\n env,\n projectPaths,\n installedPlugins,\n engineVersion: ENGINE_VERSION,\n portsInUse: [],\n };\n\n return runDiagnostics(input);\n}\n\n/**\n * Check the credential sync agent: file presence, token expiry, and\n * the watcher (launchd on macOS, systemd timer on Linux). Returns\n * an array of CheckResult so each sub-check is a separate row in\n * the doctor output.\n */\nconst SYSTEMD_CREDS_TIMER = \"beastmode-claude-creds.timer\";\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\n\nfunction checkCredentialSyncAgent(): CheckResult[] {\n const results: CheckResult[] = [];\n const credsPath = join(homedir(), \".claude\", \".credentials.json\");\n\n if (!existsSync(credsPath)) {\n results.push({\n label: \"Claude credentials file\",\n status: \"fail\",\n detail: \"~/.claude/.credentials.json not found\",\n fix:\n platform() === \"darwin\"\n ? \"Run `claude login` then `beastmode sync-claude-creds --install`\"\n : \"Run `claude login`\",\n });\n return results;\n }\n\n results.push({\n label: \"Claude credentials file\",\n status: \"pass\",\n detail: credsPath,\n });\n\n try {\n const creds = JSON.parse(readFileSync(credsPath, \"utf-8\"));\n const expiresAt = creds?.claudeAiOauth?.expiresAt;\n if (typeof expiresAt === \"number\") {\n const hoursLeft = Math.round((expiresAt - Date.now()) / 3_600_000);\n if (hoursLeft < 0) {\n results.push({\n label: \"Claude token expiry\",\n status: \"fail\",\n detail: `Token expired ${Math.abs(hoursLeft)}h ago`,\n fix: \"Run `claude login` (then `beastmode sync-claude-creds` on macOS)\",\n });\n } else if (hoursLeft < 2) {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: `Token expires in ${hoursLeft}h`,\n fix: \"Token will auto-refresh if the sync agent is running\",\n });\n } else {\n results.push({\n label: \"Claude token expiry\",\n status: \"pass\",\n detail: `Token valid (${hoursLeft}h remaining)`,\n });\n }\n } else {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: \"No expiry timestamp in credentials — cannot check freshness\",\n });\n }\n } catch {\n results.push({\n label: \"Claude token expiry\",\n status: \"warn\",\n detail: \"credentials file exists but could not be parsed\",\n });\n }\n\n if (platform() === \"darwin\") {\n const uid = process.getuid?.();\n const result = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (result.status === 0) {\n results.push({\n label: \"Credential sync agent\",\n status: \"pass\",\n detail: \"launchd LaunchAgent loaded\",\n });\n } else {\n results.push({\n label: \"Credential sync agent\",\n status: \"warn\",\n detail: \"launchd LaunchAgent not loaded\",\n fix: \"Run `beastmode sync-claude-creds --install`\",\n });\n }\n } else if (platform() === \"linux\") {\n const result = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", SYSTEMD_CREDS_TIMER],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if ((result.stdout || \"\").trim() === \"active\") {\n results.push({\n label: \"Credential sync agent\",\n status: \"pass\",\n detail: `${SYSTEMD_CREDS_TIMER} active`,\n });\n } else {\n results.push({\n label: \"Credential sync agent\",\n status: \"warn\",\n detail: `${SYSTEMD_CREDS_TIMER} not active`,\n fix: \"Run `beastmode sync-claude-creds --install`\",\n });\n }\n }\n\n return results;\n}\n\n/** Probe ``GET /api/credentials/status`` on the board API to surface\n * the daemon's CredentialBroker health. The endpoint is served on\n * the standard ports the board uses; if unreachable, this is reported\n * as info (not warn/fail) — Docker Compose may not be running.\n */\nasync function checkDaemonCredentialHealth(): Promise<CheckResult[]> {\n const ports = [8420, 8080];\n let parsed: Record<string, unknown> | null = null;\n let lastStatus: number | null = null;\n for (const port of ports) {\n const data = await new Promise<{ status: number | null; body: string }>(\n (resolveProm) => {\n const req = http.get(\n {\n host: \"127.0.0.1\",\n port,\n path: \"/api/credentials/status\",\n timeout: 5000,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (chunk) => {\n body += chunk;\n });\n res.on(\"end\", () => {\n resolveProm({ status: res.statusCode ?? null, body });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: null, body: \"\" }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: null, body: \"\" });\n });\n },\n );\n if (data.status !== null) {\n lastStatus = data.status;\n if (data.status >= 200 && data.status < 300) {\n try {\n parsed = JSON.parse(data.body);\n } catch {\n parsed = null;\n }\n break;\n }\n }\n }\n\n if (parsed === null) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"info\",\n detail:\n lastStatus === null\n ? \"Could not reach board API — Docker Compose may not be running (skipped)\"\n : `Board API returned HTTP ${lastStatus}`,\n },\n ];\n }\n\n const data = parsed as Record<string, unknown>;\n if (data.healthy === null) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"warn\",\n detail: \"No credential status reported — daemon may not be running\",\n },\n ];\n }\n if (data.stale === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"warn\",\n detail: `Last status report is stale (reported at ${data.reported_at})`,\n },\n ];\n }\n if (data.degraded === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"fail\",\n detail: `Broker DEGRADED — ${data.consecutive_failures ?? \"?\"} consecutive auth failures`,\n fix: \"Run `claude login` then `beastmode sync-claude-creds`\",\n },\n ];\n }\n if (data.token_expired === true) {\n return [\n {\n label: \"Daemon credential broker\",\n status: \"fail\",\n detail: \"Broker reports token is expired\",\n fix: \"Run `claude login` (then `beastmode sync-claude-creds` on macOS)\",\n },\n ];\n }\n return [\n {\n label: \"Daemon credential broker\",\n status: \"pass\",\n detail: `Healthy — token expires ${data.token_expires_at ?? \"unknown\"}`,\n },\n ];\n}\n\n/** Probe ``GET /api/daemon/cred-health`` on the board API.\n *\n * This is the file-based observability endpoint added by Story\n * \"Auto-sync Claude credentials to daemon\": the daemon's broker writes\n * ``.cred-health.json`` after every state transition; this endpoint\n * reads that file and adds an ``urgency_marker_present`` field. It\n * complements the push-based ``/api/credentials/status`` (which\n * depends on the scheduler reporter task) — operators can consult\n * either independently.\n *\n * Falls through to \"info\" when the API is unreachable so the doctor\n * doesn't fail when Docker Compose isn't running. */\nasync function checkDaemonCredHealth(): Promise<CheckResult[]> {\n const ports = [8420, 8080];\n let parsed: Record<string, unknown> | null = null;\n let lastStatus: number | null = null;\n\n for (const port of ports) {\n const data = await new Promise<{ status: number | null; body: string }>(\n (resolveProm) => {\n const req = http.get(\n {\n host: \"127.0.0.1\",\n port,\n path: \"/api/daemon/cred-health\",\n timeout: 5000,\n },\n (res) => {\n let body = \"\";\n res.on(\"data\", (chunk) => {\n body += chunk;\n });\n res.on(\"end\", () => {\n resolveProm({ status: res.statusCode ?? null, body });\n });\n },\n );\n req.on(\"error\", () => resolveProm({ status: null, body: \"\" }));\n req.on(\"timeout\", () => {\n req.destroy();\n resolveProm({ status: null, body: \"\" });\n });\n },\n );\n if (data.status !== null) {\n lastStatus = data.status;\n try {\n parsed = JSON.parse(data.body);\n } catch {\n parsed = null;\n }\n break;\n }\n }\n\n if (lastStatus === null) {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"info\",\n detail: \"Board API not reachable — Docker Compose may not be running (skipped)\",\n },\n ];\n }\n\n if (lastStatus === 503) {\n const detail =\n parsed && typeof parsed.detail === \"string\"\n ? String(parsed.detail)\n : \"Daemon hasn't reported credential state yet\";\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail,\n },\n ];\n }\n\n if (lastStatus !== 200 || parsed === null) {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Unexpected HTTP ${lastStatus} from /api/daemon/cred-health`,\n },\n ];\n }\n\n const data = parsed as Record<string, unknown>;\n const status = String(data.status ?? \"unknown\");\n const urgent = data.urgency_marker_present === true;\n\n if (status === \"failed\") {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"fail\",\n detail: `Broker FAILED${urgent ? \" (urgency marker present)\" : \"\"}`,\n fix: \"Run `claude login` then `beastmode sync-claude-creds`\",\n },\n ];\n }\n\n if (status === \"degraded\") {\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Broker degraded${urgent ? \" — urgency marker present\" : \"\"}`,\n fix: \"Ensure the credential sync agent is running on the host\",\n },\n ];\n }\n\n if (status === \"healthy\") {\n const hours = data.token_hours_remaining;\n const detail =\n typeof hours === \"number\"\n ? `Healthy — token has ${hours.toFixed(1)}h remaining`\n : \"Healthy\";\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"pass\",\n detail,\n },\n ];\n }\n\n return [\n {\n label: \"Daemon cred-health endpoint\",\n status: \"warn\",\n detail: `Unknown broker status: ${status}`,\n },\n ];\n}\n\nfunction printCheck(check: CheckResult): void {\n const labelPad = check.label.padEnd(22);\n if (check.status === \"pass\") {\n success(`${labelPad} ${check.detail}`);\n } else if (check.status === \"info\") {\n info(`${labelPad} ${check.detail}`);\n } else if (check.status === \"warn\") {\n warn(`${labelPad} ${check.detail}`);\n if (check.fix) {\n info(` Fix: ${check.fix}`);\n }\n } else {\n error(`${labelPad} ${check.detail}`);\n if (check.fix) {\n info(` Fix: ${check.fix}`);\n }\n }\n}\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\"Health check — validates the entire BeastMode setup\")\n .action(async () => {\n header(\"BeastMode Doctor\");\n console.log();\n\n const env = process.env as Record<string, string | undefined>;\n const factoryDir = findFactoryDir() ?? resolve(\".\");\n const hasFactory = existsSync(join(factoryDir, \".beastmode\"));\n\n const checks: CheckResult[] = [];\n\n // 1. Claude AI auth (CLI + optional API key)\n checks.push(...(await checkClaudeAuth(env.ANTHROPIC_API_KEY)));\n\n // 1a. Credential sync agent — file presence, token expiry, and the\n // watcher (launchd on macOS, systemd timer on Linux).\n checks.push(...checkCredentialSyncAgent());\n\n // 1b. Daemon credential broker — fetched via the board API. Falls\n // through to \"info\" (not warn/fail) if the API is unreachable\n // so this check doesn't fail when Docker Compose isn't running.\n checks.push(...(await checkDaemonCredentialHealth()));\n\n // 1c. File-based daemon cred-health endpoint. Reads the broker's\n // ``.cred-health.json`` via ``GET /api/daemon/cred-health`` —\n // complements the push-based 1b so a missing scheduler reporter\n // doesn't blind operators to broker state.\n checks.push(...(await checkDaemonCredHealth()));\n\n // 2. GITHUB_TOKEN / GH_TOKEN (legacy single-token check — kept\n // for backward compat; the two-PAT checks below are the\n // Gap 16 replacement).\n checks.push(checkGithubToken(env));\n\n // 2a. PROJECT_GITHUB_TOKEN (Gap 16) — validates against the actual\n // project repo's permissions.push field via api.github.com\n checks.push(await checkProjectGithubToken(env, hasFactory ? factoryDir : null));\n\n // 2b. GHCR_PULL_TOKEN (Gap 16) — validates against\n // ghcr.io/develeap/beastmode/board:latest manifest inspect\n checks.push(checkGhcrPullToken(env));\n\n // 3. Docker\n checks.push(checkDocker());\n\n // 4. Docker Compose v2 (required for the ${VAR:?} syntax in the\n // generated compose and for `docker compose ps --format json`\n // used by the factory-container check below). Gap 3 addition\n // 2026-04-15.\n checks.push(checkDockerComposeVersion());\n\n // 5. GHCR auth\n checks.push(checkGhcrAuth());\n\n // 6. GitHub CLI\n checks.push(checkGitHubCli());\n\n // 7. PROJECT_DIR in .env — load-bearing for Gap 1 + Gap 2.\n // Without this, the daemon can't resolve the target github repo\n // and every merge dies 30+ minutes into a build. 2026-04-15.\n checks.push(checkProjectDirEnv(hasFactory ? factoryDir : null));\n\n // 8. Project directory (existing check — enumerates configured\n // projects under .beastmode/projects/)\n checks.push(checkProjectDirectory(hasFactory ? factoryDir : null));\n\n // 9. Board server (localhost probe — legacy)\n checks.push(await checkBoardServer(hasFactory ? factoryDir : null));\n\n // 10. Factory containers (compose ps + health) — Gap 3 addition\n // 2026-04-15. Detects \"containers are running per compose but\n // the Node process crashed after startup\" class of bugs.\n checks.push(await checkFactoryContainers(hasFactory ? factoryDir : null));\n\n // 11. UI /board endpoint — makes sure the Node server is actually\n // serving, not just up per docker. Gap 3 addition 2026-04-15.\n checks.push(await checkUiServesBoard());\n\n // 12. Daemon config load — runs python -c inside the daemon\n // container and asserts DaemonConfig.load() succeeds and\n // validate_for_startup() returns []. This is the most\n // comprehensive check — it exercises Gap 2's resolver against\n // the real runtime environment. Gap 3 addition 2026-04-15.\n checks.push(checkDaemonConfigLoad());\n\n // 13. Board DB integrity — runs `PRAGMA integrity_check` against\n // every board SQLite file inside the board container. Detects\n // the corruption class that out-of-process sqlite3 writes cause\n // against a WAL-mode aiosqlite connection. Gap 24 addition\n // 2026-04-16.\n checks.push(checkBoardDbIntegrity());\n\n // 14. Stack\n checks.push(checkStack(hasFactory ? factoryDir : null));\n\n // 14. Playwright\n checks.push(checkPlaywright());\n\n // 15. Board UI password\n checks.push(checkBoardPassword(env, hasFactory ? factoryDir : null));\n\n // Print all checks\n for (const check of checks) {\n printCheck(check);\n }\n\n // Summary\n const passed = checks.filter((c) => c.status === \"pass\").length;\n const failed = checks.filter((c) => c.status === \"fail\").length;\n const warnings = checks.filter((c) => c.status === \"warn\").length;\n const total = checks.length;\n\n console.log();\n const parts: string[] = [];\n parts.push(`${passed}/${total} passed`);\n if (failed > 0) parts.push(`${failed} error${failed !== 1 ? \"s\" : \"\"}`);\n if (warnings > 0) parts.push(`${warnings} warning${warnings !== 1 ? \"s\" : \"\"}`);\n info(parts.join(\". \") + \".\");\n\n // Also run factory-level diagnostics if inside a factory\n if (hasFactory) {\n console.log();\n info(\"Factory diagnostics:\");\n const report = doctorAction(factoryDir, env);\n for (const check of report.checks) {\n const labelPad = check.name.padEnd(22);\n if (check.status === \"pass\") {\n success(`${labelPad} ${check.message}`);\n } else if (check.status === \"warn\") {\n warn(`${labelPad} ${check.message}`);\n if (check.fix) {\n for (const line of check.fix.split(\"\\n\")) {\n info(` Fix: ${line}`);\n }\n }\n } else {\n error(`${labelPad} ${check.message}`);\n if (check.fix) {\n for (const line of check.fix.split(\"\\n\")) {\n info(` Fix: ${line}`);\n }\n }\n }\n }\n console.log();\n info(\n `Factory: ${report.passed} passed, ${report.failed} failed, ${report.warnings} warning(s)`\n );\n }\n\n if (failed > 0) {\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { checkUpgrade, performUpgrade } from \"../../engine/upgrader.js\";\nimport { FactoryIdentitySchema } from \"../../engine/schemas.js\";\nimport { ENGINE_VERSION, SCHEMA_VERSION } from \"../../engine/version.js\";\nimport type { UpgradeCheck, UpgradeResult } from \"../../engine/upgrader.js\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\nimport { regenerateFactoryFiles } from \"../utils/regenerate.js\";\n\nfunction readIdentity(factoryDir: string) {\n const path = join(factoryDir, \".beastmode\", \"factory.json\");\n if (!existsSync(path)) {\n throw new Error(\"No factory.json found. Run beastmode init first.\");\n }\n return FactoryIdentitySchema.parse(JSON.parse(readFileSync(path, \"utf-8\")));\n}\n\nfunction readConfig(factoryDir: string): Record<string, unknown> {\n const path = join(factoryDir, \".beastmode\", \"config.json\");\n if (!existsSync(path)) {\n return {};\n }\n return JSON.parse(readFileSync(path, \"utf-8\"));\n}\n\n/**\n * Check if an upgrade is available. Exported for testing.\n */\nexport function upgradeCheckAction(factoryDir: string): UpgradeCheck {\n const identity = readIdentity(factoryDir);\n return checkUpgrade(identity, ENGINE_VERSION, SCHEMA_VERSION);\n}\n\n/**\n * Perform a full upgrade. Exported for testing.\n */\nexport function upgradeAction(factoryDir: string, migrateOnly = false): UpgradeResult {\n const identity = readIdentity(factoryDir);\n const config = readConfig(factoryDir);\n\n const targetVersion = migrateOnly ? identity.engine_version : ENGINE_VERSION;\n const result = performUpgrade(identity, config, targetVersion, SCHEMA_VERSION);\n\n if (result.changes.length > 0) {\n // Write updated factory.json\n writeFileSync(\n join(factoryDir, \".beastmode\", \"factory.json\"),\n JSON.stringify(result.updatedIdentity, null, 2) + \"\\n\"\n );\n\n // Write updated config.json\n writeFileSync(\n join(factoryDir, \".beastmode\", \"config.json\"),\n JSON.stringify(result.updatedConfig, null, 2) + \"\\n\"\n );\n }\n\n return result;\n}\n\nexport const upgradeCommand = new Command(\"upgrade\")\n .description(\"Upgrade engine version and migrate config\")\n .option(\"--check\", \"Check for updates without modifying\")\n .option(\"--migrate-only\", \"Migrate config without bumping engine version\")\n .option(\n \"--files\",\n \"Regenerate .env and docker-compose.yml from current templates while preserving user values (Gap 4). Backs up existing files with a timestamped suffix before writing.\",\n )\n .action((opts) => {\n const factoryDir = resolve(\".\");\n try {\n if (opts.files) {\n header(\"Upgrade: Regenerate factory files\");\n console.log();\n const result = regenerateFactoryFiles(factoryDir);\n\n if (result.missingValues.length > 0) {\n error(\n \"Cannot regenerate — required values missing from existing .env:\",\n );\n for (const key of result.missingValues) {\n error(` ${key}`);\n }\n error(\n \"Fix the .env by hand or re-run 'beastmode init' with the missing values, then try again.\",\n );\n process.exit(1);\n }\n\n if (!result.envChanged && !result.composeChanged) {\n success(\"Already up to date. No files needed regeneration.\");\n return;\n }\n\n if (result.envChanged) {\n info(` .env rewritten (backup: ${result.envBackupPath})`);\n }\n if (result.composeChanged) {\n info(\n ` docker-compose.yml rewritten (backup: ${result.composeBackupPath})`,\n );\n }\n console.log();\n success(\"Factory files regenerated. Run 'beastmode doctor' to verify.\");\n return;\n }\n\n if (opts.check) {\n const check = upgradeCheckAction(factoryDir);\n header(\"Upgrade Check\");\n console.log();\n info(`Current version: ${check.current_version}`);\n info(`Latest version: ${check.latest_version}`);\n info(`Schema: ${check.current_schema} -> ${check.latest_schema}`);\n console.log();\n if (check.update_available) {\n warn(\"Update available. Run: beastmode upgrade\");\n } else {\n success(\"Already up to date.\");\n }\n if (check.migration_needed) {\n warn(\"Config migration needed.\");\n }\n return;\n }\n\n const result = upgradeAction(factoryDir, !!opts.migrateOnly);\n\n header(\"Upgrade\");\n console.log();\n\n if (result.changes.length === 0) {\n success(\"Already up to date. No changes needed.\");\n return;\n }\n\n for (const change of result.changes) {\n info(` ${change}`);\n }\n if (result.migrated) {\n info(\" Config migrated (defaults filled)\");\n }\n console.log();\n success(`Upgraded from ${result.from_version} to ${result.to_version}`);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","// Regenerate an existing factory's .env and docker-compose.yml against the\n// current templates, preserving user-provided values (PROJECT_DIR, tokens,\n// UI password, optional overrides) and backing up the old files.\n//\n// This is Gap 4 general: factories created before today's generator fixes\n// (Gap 1 PROJECT_DIR drift, Gap 4 claude mount path, Gap 4 .beastmode mount\n// missing) have no way to retroactively pick up those fixes without\n// re-running `init` — which wipes custom knobs. `beastmode upgrade --files`\n// reuses the init template but preserves the values.\n//\n// Values we preserve from the existing .env:\n// - PROJECT_DIR\n// - PROJECT_GITHUB_TOKEN (and its legacy alias GITHUB_TOKEN)\n// - GHCR_PULL_TOKEN\n// - BEASTMODE_UI_PASSWORD\n// - ANTHROPIC_API_KEY (optional, commented by default)\n// - PROJECT_REPO (optional last-resort override)\n// Any other env vars the user added by hand are preserved as-is under a\n// \"# ── Custom ────\" section at the end.\n\nimport { existsSync, readFileSync, writeFileSync, copyFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { generateComposeYaml } from \"./docker.js\";\n\nexport interface ExistingFactoryValues {\n projectDir: string | null;\n projectGithubToken: string | null;\n ghcrPullToken: string | null;\n uiPassword: string | null;\n anthropicApiKey: string | null;\n projectRepoOverride: string | null;\n // Lines the user added that we don't recognize — preserved verbatim under a\n // \"Custom\" section.\n customLines: string[];\n}\n\n// Known keys the regenerator owns. Anything not in this set is treated as a\n// user customization and preserved verbatim.\nconst RECOGNIZED_KEYS = new Set([\n \"PROJECT_DIR\",\n \"PROJECT_GITHUB_TOKEN\",\n \"GITHUB_TOKEN\", // legacy alias — reads mapped to projectGithubToken\n \"GHCR_PULL_TOKEN\",\n \"BEASTMODE_UI_PASSWORD\",\n \"ANTHROPIC_API_KEY\",\n \"PROJECT_REPO\",\n]);\n\n/**\n * Parse an existing .env file and extract the values the regenerator knows\n * about. Unknown lines are collected into customLines so upgrade doesn't\n * silently drop user edits.\n */\nexport function parseExistingEnv(envContent: string): ExistingFactoryValues {\n const values: ExistingFactoryValues = {\n projectDir: null,\n projectGithubToken: null,\n ghcrPullToken: null,\n uiPassword: null,\n anthropicApiKey: null,\n projectRepoOverride: null,\n customLines: [],\n };\n\n // Split on real newlines only; don't touch lines that look like comments\n // or blanks — they're regenerated from the template anyway.\n for (const rawLine of envContent.split(/\\r?\\n/)) {\n const line = rawLine.trimEnd();\n if (line === \"\" || line.startsWith(\"#\")) {\n continue;\n }\n\n // KEY=VALUE — use the first '=' only so values containing '=' survive\n const eq = line.indexOf(\"=\");\n if (eq === -1) {\n // Malformed line the user wrote — preserve verbatim\n values.customLines.push(rawLine);\n continue;\n }\n const key = line.slice(0, eq).trim();\n const value = line.slice(eq + 1);\n\n if (!RECOGNIZED_KEYS.has(key)) {\n values.customLines.push(rawLine);\n continue;\n }\n\n switch (key) {\n case \"PROJECT_DIR\":\n values.projectDir = value;\n break;\n case \"PROJECT_GITHUB_TOKEN\":\n values.projectGithubToken = value;\n break;\n case \"GITHUB_TOKEN\":\n // Legacy alias. Only use it if we haven't seen the canonical key yet —\n // PROJECT_GITHUB_TOKEN wins if both are present.\n if (values.projectGithubToken === null) {\n values.projectGithubToken = value;\n }\n break;\n case \"GHCR_PULL_TOKEN\":\n values.ghcrPullToken = value;\n break;\n case \"BEASTMODE_UI_PASSWORD\":\n values.uiPassword = value;\n break;\n case \"ANTHROPIC_API_KEY\":\n values.anthropicApiKey = value;\n break;\n case \"PROJECT_REPO\":\n values.projectRepoOverride = value;\n break;\n }\n }\n\n return values;\n}\n\n/**\n * Build the new .env body from the current template, filling in the values\n * we parsed from the existing file. The template must match init.ts's\n * output exactly (structure, header comments, blank lines) so successive\n * upgrades are idempotent.\n *\n * If any required value is missing from the old .env, the result will have\n * an empty string for that key — the caller should validate BEFORE calling\n * this, and surface a clear remediation message.\n */\nexport function buildNewEnv(values: ExistingFactoryValues): string {\n const lines: string[] = [\n \"# BeastMode environment — DO NOT COMMIT\",\n \"\",\n \"# ── Project credentials (Gap 16 — two-PAT model) ──────────────\",\n \"# PROJECT_GITHUB_TOKEN: used by the daemon and Claude to commit /\",\n \"# push / open PRs / merge / review against the target project repo.\",\n \"# Needs `repo` scope for private repos, `public_repo` for public.\",\n \"# Aliased to GITHUB_TOKEN for backward compat with the gh CLI and\",\n \"# any code that still reads GITHUB_TOKEN.\",\n `PROJECT_GITHUB_TOKEN=${values.projectGithubToken ?? \"\"}`,\n `GITHUB_TOKEN=${values.projectGithubToken ?? \"\"}`,\n \"\",\n \"# GHCR_PULL_TOKEN: used by `docker compose pull` to fetch the\",\n \"# beastmode factory images from ghcr.io/develeap/beastmode/*.\",\n \"# Maintainer-provided (shared across a team) or your own PAT with\",\n \"# `read:packages` scope added. Rotates rarely. May be the same as\",\n \"# PROJECT_GITHUB_TOKEN but is normally a separate dedicated token.\",\n `GHCR_PULL_TOKEN=${values.ghcrPullToken ?? \"\"}`,\n \"\",\n `BEASTMODE_UI_PASSWORD=${values.uiPassword ?? \"\"}`,\n \"\",\n \"# ── Project location ─────────────────────────────────────────\",\n \"# Required. The daemon's git operations target the git remote of\",\n \"# this path. The daemon auto-resolves the github repo from\",\n \"# `git -C $PROJECT_DIR remote get-url origin` at startup.\",\n `PROJECT_DIR=${values.projectDir ?? \"\"}`,\n \"\",\n \"# ── Optional ─────────────────────────────────────────────────\",\n \"# Uncomment for faster direct Anthropic API calls (bypasses the\",\n \"# Claude Code subscription auth via ~/.claude.json).\",\n values.anthropicApiKey !== null\n ? `ANTHROPIC_API_KEY=${values.anthropicApiKey}`\n : \"# ANTHROPIC_API_KEY=sk-ant-...\",\n \"\",\n \"# Last-resort override if the daemon's project_repo auto-resolution\",\n \"# (git remote get-url origin) doesn't work for your setup.\",\n \"# The daemon handles this automatically in >99% of cases.\",\n values.projectRepoOverride !== null\n ? `PROJECT_REPO=${values.projectRepoOverride}`\n : \"# PROJECT_REPO=owner/repo\",\n \"\",\n ];\n\n if (values.customLines.length > 0) {\n lines.push(\n \"# ── Custom (preserved verbatim from pre-upgrade .env) ────────\",\n );\n lines.push(...values.customLines);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nexport interface RegenerateResult {\n envChanged: boolean;\n composeChanged: boolean;\n envBackupPath: string | null;\n composeBackupPath: string | null;\n missingValues: string[]; // keys that were required but absent from old .env\n}\n\n/**\n * Regenerate a factory's .env and docker-compose.yml from current templates,\n * preserving values from the existing files.\n *\n * Idempotent: running twice on the same factory produces no changes on the\n * second run (assuming no generator changes). Each write is preceded by a\n * timestamped backup copy.\n *\n * Does NOT modify files if the existing values are missing required fields —\n * returns the missing list for the caller to surface.\n */\nexport function regenerateFactoryFiles(\n factoryDir: string,\n now: Date = new Date(),\n): RegenerateResult {\n const envPath = join(factoryDir, \".env\");\n const composePath = join(factoryDir, \"docker-compose.yml\");\n\n if (!existsSync(envPath)) {\n throw new Error(\n `.env not found at ${envPath}. This does not look like a beastmode factory — run 'beastmode init' first.`,\n );\n }\n if (!existsSync(composePath)) {\n throw new Error(\n `docker-compose.yml not found at ${composePath}. This does not look like a beastmode factory — run 'beastmode init' first.`,\n );\n }\n\n const existingEnv = readFileSync(envPath, \"utf-8\");\n const values = parseExistingEnv(existingEnv);\n\n // Required values — the daemon won't start without these.\n const missing: string[] = [];\n if (!values.projectDir) missing.push(\"PROJECT_DIR\");\n if (!values.projectGithubToken) missing.push(\"PROJECT_GITHUB_TOKEN\");\n if (!values.ghcrPullToken) missing.push(\"GHCR_PULL_TOKEN\");\n if (!values.uiPassword) missing.push(\"BEASTMODE_UI_PASSWORD\");\n\n if (missing.length > 0) {\n return {\n envChanged: false,\n composeChanged: false,\n envBackupPath: null,\n composeBackupPath: null,\n missingValues: missing,\n };\n }\n\n const newEnv = buildNewEnv(values);\n const newCompose = generateComposeYaml(\"latest\");\n\n const existingCompose = readFileSync(composePath, \"utf-8\");\n\n const envChanged = newEnv !== existingEnv;\n const composeChanged = newCompose !== existingCompose;\n\n if (!envChanged && !composeChanged) {\n return {\n envChanged: false,\n composeChanged: false,\n envBackupPath: null,\n composeBackupPath: null,\n missingValues: [],\n };\n }\n\n const timestamp = now.toISOString().replace(/[:.]/g, \"-\");\n let envBackupPath: string | null = null;\n let composeBackupPath: string | null = null;\n\n if (envChanged) {\n envBackupPath = `${envPath}.backup.${timestamp}`;\n copyFileSync(envPath, envBackupPath);\n writeFileSync(envPath, newEnv, \"utf-8\");\n }\n\n if (composeChanged) {\n composeBackupPath = `${composePath}.backup.${timestamp}`;\n copyFileSync(composePath, composeBackupPath);\n writeFileSync(composePath, newCompose, \"utf-8\");\n }\n\n return {\n envChanged,\n composeChanged,\n envBackupPath,\n composeBackupPath,\n missingValues: [],\n };\n}\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, readFileSync, mkdirSync, writeFileSync, symlinkSync } from \"fs\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\nimport {\n parseDaemonConfig,\n generateMigration,\n inventoryActiveState,\n type ActiveState,\n type RunCheckpoint,\n} from \"../../engine/migrator.js\";\n\nexport const migrateCommand = new Command(\"migrate\")\n .description(\"Migrate a daemon config into a .beastmode/ factory\")\n .option(\"--config <path>\", \"Path to beastmode.daemon.json\")\n .option(\"--dry-run\", \"Show what would be created without writing files\")\n .action(async (opts) => {\n try {\n await runMigrate(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface MigrateOptions {\n config?: string;\n dryRun?: boolean;\n}\n\nasync function runMigrate(opts: MigrateOptions): Promise<void> {\n const cwd = process.cwd();\n\n // Find daemon config\n const configPath = opts.config\n ? resolve(opts.config)\n : resolve(cwd, \"config\", \"beastmode.daemon.json\");\n\n if (!existsSync(configPath)) {\n throw new Error(\n `Daemon config not found at ${configPath}\\n` +\n \" Use --config <path> to specify a different location.\"\n );\n }\n\n header(\"BeastMode Migrate\");\n info(`Reading daemon config from: ${configPath}`);\n\n // Parse daemon config\n const configContent = readFileSync(configPath, \"utf-8\");\n const daemonConfig = parseDaemonConfig(configContent);\n\n // Inventory active state\n const runsDir = join(cwd, \"runs\");\n let runDirs: string[] = [];\n const checkpoints = new Map<string, RunCheckpoint>();\n\n if (existsSync(runsDir)) {\n const { readdirSync } = await import(\"fs\");\n runDirs = readdirSync(runsDir).filter((d) => {\n try {\n return readdirSync(join(runsDir, d)).length > 0;\n } catch {\n return false;\n }\n });\n\n for (const dir of runDirs) {\n const cpPath = join(runsDir, dir, \"checkpoint.json\");\n if (existsSync(cpPath)) {\n try {\n const cp = JSON.parse(readFileSync(cpPath, \"utf-8\"));\n checkpoints.set(dir, cp);\n } catch {\n // Skip invalid checkpoints\n }\n }\n }\n }\n\n // Get worktree info\n let worktreeOutput = \"\";\n try {\n const { execSync } = await import(\"child_process\");\n worktreeOutput = execSync(\"git worktree list\", {\n cwd,\n encoding: \"utf-8\",\n timeout: 5000,\n });\n } catch {\n // Not a git repo or git not available — fine\n }\n\n const activeState: ActiveState = inventoryActiveState(\n runDirs,\n checkpoints,\n worktreeOutput\n );\n\n // Determine factory name from directory\n const factoryName = cwd.split(\"/\").pop() || \"beastmode-factory\";\n\n // Generate migration\n const { files, report } = generateMigration(\n factoryName,\n daemonConfig,\n activeState\n );\n\n // Report findings\n console.log();\n info(\"Active State:\");\n info(` Runs: ${activeState.totalRuns} total, ${activeState.activeRuns.length} active`);\n info(` Worktrees: ${activeState.worktrees.length}`);\n\n if (activeState.activeRuns.length > 0) {\n warn(\"Active runs detected — they will continue working after migration.\");\n }\n\n console.log();\n info(\"Config Mappings:\");\n for (const mapping of report.configMappings) {\n info(` ${mapping.from} -> ${mapping.to}`);\n }\n\n if (report.droppedKeys.length > 0) {\n console.log();\n info(\"Dropped Keys (daemon-specific):\");\n for (const key of report.droppedKeys) {\n info(` ${key}`);\n }\n }\n\n console.log();\n info(\"Files to create:\");\n for (const file of files) {\n info(` ${file.path}`);\n }\n\n if (opts.dryRun) {\n console.log();\n warn(\"Dry run — no files written.\");\n return;\n }\n\n // Check if factory already exists\n const bmDir = join(cwd, \".beastmode\");\n if (existsSync(bmDir)) {\n throw new Error(\n \"A .beastmode/ directory already exists. Remove it first to re-migrate.\"\n );\n }\n\n // Write files\n for (const file of files) {\n const fullPath = join(cwd, file.path);\n const dir = fullPath.substring(0, fullPath.lastIndexOf(\"/\"));\n mkdirSync(dir, { recursive: true });\n writeFileSync(fullPath, file.content, \"utf-8\");\n }\n\n // Symlink runs/ if it exists\n const runsSymlinkTarget = join(cwd, \"runs\");\n const bmRunsPath = join(cwd, \"runs\"); // runs/ stays at root, same location\n if (existsSync(runsSymlinkTarget)) {\n info(\"Existing runs/ directory preserved in-place.\");\n }\n\n // Create board.json if not already created by migration\n const boardPath = join(bmDir, \"board.json\");\n if (!existsSync(boardPath)) {\n writeFileSync(boardPath, JSON.stringify({ items: [] }, null, 2), \"utf-8\");\n }\n\n // Create .cache directory for bridge\n mkdirSync(join(bmDir, \".cache\"), { recursive: true });\n\n console.log();\n success(\"Migration complete!\");\n info(`Factory created at: ${bmDir}`);\n info(\"Old daemon config preserved at original location.\");\n\n if (report.projectName) {\n info(`Project registered: ${report.projectName}`);\n }\n\n console.log();\n info(\"Next steps:\");\n info(\" beastmode board — launch the board UI\");\n info(\" beastmode deploy — deploy as a systemd service (Linux servers)\");\n info(\" beastmode status — check factory status\");\n info(\" beastmode daemon — start the daemon via bridge\");\n}\n","import { Command } from \"commander\";\nimport { join } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { randomUUID } from \"crypto\";\nimport { header, info, success, warn, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\nimport { generateDaemonConfig, findPythonDaemonPaths, buildDaemonCommand } from \"../../engine/bridge.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"../../engine/schemas.js\";\nimport type { FactoryConfig, ProjectConfig } from \"../../engine/types.js\";\n\nexport const runCommand = new Command(\"run\")\n .description(\"Run a single pipeline task\")\n .argument(\"[project]\", \"Project name (defaults to first project)\")\n .option(\"--task <description>\", \"Task description\")\n .action(async (project, opts) => {\n try {\n await runPipeline(project, opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface RunOptions {\n task?: string;\n}\n\nasync function runPipeline(\n projectName: string | undefined,\n opts: RunOptions\n): Promise<void> {\n if (!opts.task) {\n throw new Error(\"Missing required option: --task <description>\");\n }\n\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\n \"No BeastMode factory found. Run 'beastmode init' first.\"\n );\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n header(\"BeastMode Run\");\n\n // Load factory config\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"Factory config not found. Run 'beastmode init' first.\");\n }\n const factoryConfig = FactoryConfigSchema.parse(\n JSON.parse(readFileSync(configPath, \"utf-8\"))\n ) as FactoryConfig;\n\n // Load project config\n let projectConfig: ProjectConfig | null = null;\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n const { readdirSync } = await import(\"fs\");\n const projectFiles = readdirSync(projectsDir).filter((f) =>\n f.endsWith(\".json\")\n );\n\n if (projectName) {\n const file = projectFiles.find(\n (f) => f === `${projectName}.json`\n );\n if (!file) {\n throw new Error(`Project not found: ${projectName}`);\n }\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, file), \"utf-8\"))\n ) as ProjectConfig;\n } else if (projectFiles.length > 0) {\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, projectFiles[0]), \"utf-8\"))\n ) as ProjectConfig;\n info(`Using project: ${projectConfig.name}`);\n }\n }\n\n // Create task on the board\n const boardPath = join(bmDir, \"board.json\");\n let boardItems: Array<{\n id: string;\n title: string;\n description: string;\n status: string;\n created_at: string;\n updated_at: string;\n }> = [];\n if (existsSync(boardPath)) {\n try {\n const raw = JSON.parse(readFileSync(boardPath, \"utf-8\"));\n boardItems = Array.isArray(raw.items) ? raw.items : [];\n } catch {\n boardItems = [];\n }\n }\n\n const now = new Date().toISOString();\n const taskId = randomUUID();\n const task = {\n id: taskId,\n title: opts.task,\n description: \"\",\n status: \"ready\",\n created_at: now,\n updated_at: now,\n };\n boardItems.push(task);\n writeFileSync(boardPath, JSON.stringify({ items: boardItems }, null, 2), \"utf-8\");\n info(`Created task: ${task.title} (${taskId})`);\n\n // Generate daemon config\n const cacheDir = join(bmDir, \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n const daemonConfigPath = join(cacheDir, \"daemon.json\");\n const daemonConfig = generateDaemonConfig(factoryConfig, projectConfig, factoryDir);\n writeFileSync(daemonConfigPath, JSON.stringify(daemonConfig, null, 2), \"utf-8\");\n info(`Generated daemon config at: ${daemonConfigPath}`);\n\n // Check for Python\n const { execSync } = await import(\"child_process\");\n let pythonAvailable = false;\n try {\n execSync(\"python --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n } catch {\n try {\n execSync(\"python3 --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n } catch {\n // No Python\n }\n }\n\n if (!pythonAvailable) {\n warn(\"Python not found. Cannot spawn the daemon.\");\n warn(\"The task has been created on the board. Start the daemon manually:\");\n info(` python -m beastmode_daemon --config ${daemonConfigPath}`);\n return;\n }\n\n // Find daemon package\n const envPath = process.env.BEASTMODE_DAEMON_PATH;\n const daemonPaths = findPythonDaemonPaths(envPath, factoryDir);\n let daemonFound = false;\n\n for (const p of daemonPaths) {\n if (existsSync(p)) {\n daemonFound = true;\n break;\n }\n }\n\n if (!daemonFound) {\n warn(\"BeastMode daemon package not found in expected locations.\");\n warn(\"The task has been created on the board. Start the daemon manually:\");\n info(` python -m beastmode_daemon --config ${daemonConfigPath}`);\n return;\n }\n\n // Spawn daemon\n const cmd = buildDaemonCommand(null, daemonConfigPath);\n info(`Spawning daemon: ${cmd.command} ${cmd.args.join(\" \")}`);\n\n const { spawn } = await import(\"child_process\");\n const child = spawn(cmd.command, cmd.args, {\n stdio: \"inherit\",\n cwd: factoryDir,\n env: {\n ...process.env,\n BEASTMODE_ROOT: factoryDir,\n },\n });\n\n // Poll for task completion\n const POLL_INTERVAL = 5000;\n const MAX_POLL_TIME = 3600000; // 1 hour\n const startTime = Date.now();\n\n const pollInterval = setInterval(() => {\n try {\n const board = JSON.parse(readFileSync(boardPath, \"utf-8\"));\n const items = Array.isArray(board.items) ? board.items : [];\n const taskItem = items.find((i: { id: string }) => i.id === taskId);\n\n if (taskItem) {\n const status = taskItem.status;\n if (status === \"done\") {\n clearInterval(pollInterval);\n success(`Task completed: ${opts.task}`);\n child.kill(\"SIGTERM\");\n } else if (status === \"stuck\") {\n clearInterval(pollInterval);\n warn(`Task stuck: ${opts.task}`);\n child.kill(\"SIGTERM\");\n }\n }\n\n if (Date.now() - startTime > MAX_POLL_TIME) {\n clearInterval(pollInterval);\n warn(\"Timeout: task did not complete within 1 hour.\");\n child.kill(\"SIGTERM\");\n }\n } catch {\n // Board file may be locked — retry next interval\n }\n }, POLL_INTERVAL);\n\n // Forward signals\n const signalHandler = (signal: NodeJS.Signals) => {\n clearInterval(pollInterval);\n child.kill(signal);\n };\n process.on(\"SIGINT\", () => signalHandler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => signalHandler(\"SIGTERM\"));\n\n // Wait for child to exit\n await new Promise<void>((resolvePromise) => {\n child.on(\"exit\", (code) => {\n clearInterval(pollInterval);\n if (code !== 0 && code !== null) {\n warn(`Daemon exited with code ${code}`);\n }\n resolvePromise();\n });\n });\n}\n","import { Command } from \"commander\";\nimport { join } from \"path\";\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from \"fs\";\nimport { header, info, success, warn, error } from \"../utils/display.js\";\nimport { findFactoryDir } from \"./board.js\";\nimport { generateDaemonConfig, buildDaemonCommand } from \"../../engine/bridge.js\";\nimport { FactoryConfigSchema, ProjectConfigSchema } from \"../../engine/schemas.js\";\nimport type { FactoryConfig, ProjectConfig } from \"../../engine/types.js\";\n\nexport const daemonCommand = new Command(\"daemon\")\n .description(\"Start the BeastMode daemon via bridge\")\n .option(\"--dry-run\", \"Generate config but don't start daemon\")\n .option(\n \"--log-level <level>\",\n \"Log level (DEBUG, INFO, WARNING, ERROR)\",\n \"INFO\"\n )\n .action(async (opts) => {\n try {\n await runDaemon(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface DaemonOptions {\n dryRun?: boolean;\n logLevel: string;\n}\n\nasync function runDaemon(opts: DaemonOptions): Promise<void> {\n const factoryDir = findFactoryDir();\n if (!factoryDir) {\n throw new Error(\n \"No BeastMode factory found. Run 'beastmode init' first.\"\n );\n }\n\n const bmDir = join(factoryDir, \".beastmode\");\n header(\"BeastMode Daemon\");\n\n // Load factory config\n const configPath = join(bmDir, \"config.json\");\n if (!existsSync(configPath)) {\n throw new Error(\"Factory config not found. Run 'beastmode init' first.\");\n }\n const factoryConfig = FactoryConfigSchema.parse(\n JSON.parse(readFileSync(configPath, \"utf-8\"))\n ) as FactoryConfig;\n\n // Load first project config (if any)\n let projectConfig: ProjectConfig | null = null;\n const projectsDir = join(bmDir, \"projects\");\n if (existsSync(projectsDir)) {\n const { readdirSync } = await import(\"fs\");\n const projectFiles = readdirSync(projectsDir).filter((f) =>\n f.endsWith(\".json\")\n );\n if (projectFiles.length > 0) {\n projectConfig = ProjectConfigSchema.parse(\n JSON.parse(readFileSync(join(projectsDir, projectFiles[0]), \"utf-8\"))\n ) as ProjectConfig;\n info(`Using project: ${projectConfig.name}`);\n }\n }\n\n // Generate daemon config\n const cacheDir = join(bmDir, \".cache\");\n mkdirSync(cacheDir, { recursive: true });\n const daemonConfigPath = join(cacheDir, \"daemon.json\");\n const daemonConfig = generateDaemonConfig(\n factoryConfig,\n projectConfig,\n factoryDir\n );\n writeFileSync(\n daemonConfigPath,\n JSON.stringify(daemonConfig, null, 2),\n \"utf-8\"\n );\n info(`Generated daemon config at: ${daemonConfigPath}`);\n\n if (opts.dryRun) {\n console.log();\n info(\"Dry run — daemon config generated but not started.\");\n info(\"Generated config:\");\n console.log(JSON.stringify(daemonConfig, null, 2));\n return;\n }\n\n // Check for Python\n const { execSync } = await import(\"child_process\");\n let pythonCmd = \"python\";\n let pythonAvailable = false;\n\n try {\n execSync(\"python --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n pythonCmd = \"python\";\n } catch {\n try {\n execSync(\"python3 --version\", { timeout: 5000, encoding: \"utf-8\" });\n pythonAvailable = true;\n pythonCmd = \"python3\";\n } catch {\n // No Python\n }\n }\n\n if (!pythonAvailable) {\n throw new Error(\n \"Python not found. The BeastMode daemon requires Python 3.10+.\\n\" +\n \"Install Python or set BEASTMODE_DAEMON_PATH to the daemon package.\"\n );\n }\n\n // Build command\n const cmd = buildDaemonCommand(null, daemonConfigPath, {\n dryRun: false,\n logLevel: opts.logLevel,\n });\n\n info(`Starting daemon: ${pythonCmd} ${cmd.args.join(\" \")}`);\n console.log();\n\n // Write PID file (we'll write the child PID after spawn)\n const pidFile = join(bmDir, \"daemon.pid\");\n\n // Spawn daemon\n const { spawn } = await import(\"child_process\");\n const child = spawn(pythonCmd, cmd.args, {\n stdio: \"inherit\",\n cwd: factoryDir,\n env: {\n ...process.env,\n BEASTMODE_ROOT: factoryDir,\n },\n });\n\n // Write PID file\n if (child.pid) {\n writeFileSync(pidFile, String(child.pid), \"utf-8\");\n }\n\n // Forward signals to child\n const signalHandler = (signal: NodeJS.Signals) => {\n info(`Forwarding ${signal} to daemon...`);\n child.kill(signal);\n };\n process.on(\"SIGINT\", () => signalHandler(\"SIGINT\"));\n process.on(\"SIGTERM\", () => signalHandler(\"SIGTERM\"));\n\n // Wait for child to exit\n const exitCode = await new Promise<number>((resolvePromise) => {\n child.on(\"exit\", (code) => {\n // Clean up PID file\n try {\n const { unlinkSync } = require(\"fs\");\n unlinkSync(pidFile);\n } catch {\n // File may not exist\n }\n resolvePromise(code ?? 1);\n });\n });\n\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n}\n","import { Command } from \"commander\";\n\nexport const mcpCommand = new Command(\"mcp\")\n .description(\"Start the BeastMode MCP server (stdio transport)\")\n .action(async () => {\n try {\n const { startMcpServer } = await import(\"../../mcp/index.js\");\n await startMcpServer();\n } catch (err) {\n // Write errors to stderr (stdout is used for MCP protocol)\n process.stderr.write(`BeastMode MCP error: ${(err as Error).message}\\n`);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { resolve, join } from \"path\";\nimport { existsSync, writeFileSync, readFileSync } from \"fs\";\nimport { execSync } from \"child_process\";\nimport { randomBytes } from \"crypto\";\nimport { header, success, error, info, warn } from \"../utils/display.js\";\nimport { fileURLToPath } from \"url\";\nimport { dirname } from \"path\";\n\nexport const deployCommand = new Command(\"deploy\")\n .description(\"Deploy BeastMode services as systemd services\")\n .option(\"--port <number>\", \"Port to serve the board UI on\", \"8420\")\n .option(\"--host <host>\", \"Host to bind the board UI to\", \"0.0.0.0\")\n .option(\"--dry-run\", \"Show what would be done without executing\")\n .option(\"--no-start\", \"Install services but don't start them\")\n .option(\"--stop\", \"Stop all 3 BeastMode services\")\n .option(\"--status\", \"Show status of all 3 BeastMode services\")\n .option(\"--cloud <provider>\", \"Deploy to cloud (aws)\")\n .option(\"--upgrade\", \"Update an existing cloud deployment\")\n .option(\"--destroy\", \"Destroy the cloud deployment (delete CloudFormation stack)\")\n .action(async (opts) => {\n try {\n await runDeploy(opts);\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n\ninterface DeployOptions {\n port: string;\n host: string;\n dryRun?: boolean;\n start: boolean; // commander inverts --no-start to start=false\n stop?: boolean;\n status?: boolean;\n cloud?: string;\n upgrade?: boolean;\n destroy?: boolean;\n}\n\nconst SERVICE_NAMES = [\"beastmode-ui\", \"beastmode-board\", \"beastmode\"];\n\nasync function runDeploy(opts: DeployOptions): Promise<void> {\n if (opts.cloud === 'aws') {\n await deployToAWS(opts);\n return;\n }\n\n // Handle --status flag\n if (opts.status) {\n header(\"BeastMode Service Status\");\n for (const name of SERVICE_NAMES) {\n try {\n const out = execSync(`systemctl status ${name} --no-pager 2>&1 || true`, {\n encoding: \"utf-8\",\n shell: \"/bin/bash\",\n });\n console.log(out);\n } catch {\n warn(`Could not get status for ${name}`);\n }\n }\n return;\n }\n\n // Handle --stop flag\n if (opts.stop) {\n header(\"Stopping BeastMode Services\");\n for (const name of SERVICE_NAMES) {\n info(`Stopping ${name}...`);\n try {\n execSync(`sudo systemctl stop ${name}`, { stdio: \"inherit\" });\n success(`${name} stopped`);\n } catch {\n warn(`Could not stop ${name} (may not be running)`);\n }\n }\n return;\n }\n\n header(\"BeastMode Deploy\");\n\n // Check platform\n if (process.platform !== \"linux\") {\n error(\n \"Deploy is only supported on Linux (systemd). For macOS/Windows, run 'beastmode board' directly.\"\n );\n process.exit(1);\n }\n\n // Find factory\n const factoryDir = resolve(\".\");\n const bmDir = join(factoryDir, \".beastmode\");\n if (!existsSync(bmDir)) {\n error(\n \"No .beastmode directory found. Run 'beastmode init' or 'beastmode migrate' first.\"\n );\n process.exit(1);\n }\n\n // Find node and beastmode paths\n let nodePath: string;\n let cliPath: string;\n try {\n nodePath = execSync(\"which node\", { encoding: \"utf-8\" }).trim();\n } catch {\n nodePath = process.execPath;\n }\n\n try {\n cliPath = execSync(\n \"readlink -f $(which beastmode) 2>/dev/null || which beastmode\",\n { encoding: \"utf-8\", shell: \"/bin/bash\" }\n ).trim();\n } catch {\n // Fallback to resolving from __dirname\n cliPath = resolve(\n new URL(\".\", import.meta.url).pathname,\n \"../../index.js\"\n );\n }\n\n // Find Python for board and daemon (prefer venv, fall back to system python3)\n const boardVenvPython = join(factoryDir, \"board\", \".venv\", \"bin\", \"python\");\n const daemonVenvPython = join(factoryDir, \"daemon\", \".venv\", \"bin\", \"python\");\n const boardPython = existsSync(boardVenvPython) ? boardVenvPython : \"python3\";\n const daemonPython = existsSync(daemonVenvPython) ? daemonVenvPython : \"python3\";\n\n const user = execSync(\"whoami\", { encoding: \"utf-8\" }).trim();\n const home = process.env.HOME || `/home/${user}`;\n const port = opts.port;\n const host = opts.host;\n\n // Ensure board UI password is set for remote deployments\n const dotEnv = join(factoryDir, \".env\");\n const secretsEnv = join(bmDir, \"secrets.env.local\");\n const envContent = existsSync(dotEnv) ? readFileSync(dotEnv, \"utf-8\") : \"\";\n const secretsContent = existsSync(secretsEnv) ? readFileSync(secretsEnv, \"utf-8\") : \"\";\n const hasPassword = envContent.includes(\"BEASTMODE_UI_PASSWORD=\") && !envContent.includes(\"BEASTMODE_UI_PASSWORD=\\n\")\n || secretsContent.includes(\"BEASTMODE_UI_PASSWORD=\") && !secretsContent.includes(\"BEASTMODE_UI_PASSWORD=\\n\")\n || !!process.env.BEASTMODE_UI_PASSWORD;\n\n if (!hasPassword && opts.host === \"0.0.0.0\") {\n const generated = randomBytes(18).toString(\"base64url\");\n const target = existsSync(secretsEnv) ? secretsEnv : dotEnv;\n const append = `\\n# Auto-generated board UI password (deploy)\\nBEASTMODE_UI_PASSWORD=${generated}\\n`;\n writeFileSync(target, (existsSync(target) ? readFileSync(target, \"utf-8\") : \"\") + append, \"utf-8\");\n info(`Board UI password auto-generated and saved to ${target}`);\n success(`Password: ${generated}`);\n info(\"Save this password — you'll need it to access the board UI.\");\n }\n\n // Build shared EnvironmentFile lines (same for all 3 services)\n const envFileLines: string[] = [];\n if (existsSync(secretsEnv)) {\n envFileLines.push(`EnvironmentFile=${secretsEnv}`);\n } else {\n envFileLines.push(`# No secrets.env.local found at time of deploy`);\n }\n // Use optional (-) prefix for .env so systemd doesn't fail if it's missing\n envFileLines.push(`EnvironmentFile=-${dotEnv}`);\n\n // ── Service 1: beastmode-ui (Board UI) ──\n const uiServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Board UI\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}`,\n `ExecStart=${nodePath} ${cliPath} board --port ${port} --host ${host}`,\n \"Restart=always\",\n \"RestartSec=5\",\n \"Environment=NODE_ENV=production\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n // ── Service 2: beastmode-board (FastAPI board server) ──\n const boardServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Board API Server\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}/board`,\n `ExecStart=${boardPython} -m uvicorn board_server.app:create_app --factory --host 0.0.0.0 --port 8080`,\n \"Restart=always\",\n \"RestartSec=5\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n // ── Service 3: beastmode (Daemon) ──\n const daemonServiceContent = [\n \"[Unit]\",\n \"Description=BeastMode Daemon\",\n \"After=network.target\",\n \"\",\n \"[Service]\",\n \"Type=simple\",\n `User=${user}`,\n `WorkingDirectory=${factoryDir}/daemon`,\n `ExecStart=${daemonPython} -m beastmode_daemon`,\n \"Restart=always\",\n \"RestartSec=5\",\n `Environment=HOME=${home}`,\n ...envFileLines,\n \"\",\n \"[Install]\",\n \"WantedBy=multi-user.target\",\n \"\",\n ].join(\"\\n\");\n\n const services: Array<{ name: string; path: string; content: string }> = [\n { name: \"beastmode-ui\", path: \"/etc/systemd/system/beastmode-ui.service\", content: uiServiceContent },\n { name: \"beastmode-board\", path: \"/etc/systemd/system/beastmode-board.service\", content: boardServiceContent },\n { name: \"beastmode\", path: \"/etc/systemd/system/beastmode.service\", content: daemonServiceContent },\n ];\n\n if (opts.dryRun) {\n info(\"Dry run — would create:\");\n for (const svc of services) {\n console.log();\n info(`=== ${svc.name} → ${svc.path} ===`);\n console.log(svc.content);\n }\n info(`Would run: systemctl daemon-reload && systemctl enable/start each service`);\n return;\n }\n\n // Write all 3 service files\n for (const svc of services) {\n info(`Writing service file to ${svc.path}...`);\n try {\n const tmpPath = `/tmp/${svc.name}.service`;\n writeFileSync(tmpPath, svc.content, \"utf-8\");\n execSync(`sudo cp ${tmpPath} ${svc.path}`, { stdio: \"inherit\" });\n success(`${svc.name} service file installed`);\n } catch {\n error(\n `Failed to write service file for ${svc.name}. Run with sudo or manually copy:\\n${svc.content}`\n );\n process.exit(1);\n }\n }\n\n // Reload systemd once after writing all 3\n info(\"Reloading systemd...\");\n execSync(\"sudo systemctl daemon-reload\", { stdio: \"inherit\" });\n success(\"systemd reloaded\");\n\n // Enable and (optionally) start all 3 services\n for (const svc of services) {\n info(`Enabling ${svc.name}...`);\n execSync(`sudo systemctl enable ${svc.name}`, { stdio: \"inherit\" });\n success(`${svc.name} enabled (will start on boot)`);\n\n if (opts.start !== false) {\n info(`Starting ${svc.name}...`);\n execSync(`sudo systemctl restart ${svc.name}`, { stdio: \"inherit\" });\n }\n }\n\n if (opts.start !== false) {\n // Wait briefly then check status of all services\n await new Promise((r) => setTimeout(r, 2000));\n for (const svc of services) {\n try {\n const status = execSync(`systemctl is-active ${svc.name}`, {\n encoding: \"utf-8\",\n }).trim();\n if (status === \"active\") {\n success(`${svc.name} is running`);\n } else {\n warn(`${svc.name} status: ${status}. Check: sudo journalctl -u ${svc.name} -n 20`);\n }\n } catch {\n warn(`Could not verify ${svc.name} status. Check: sudo journalctl -u ${svc.name} -n 20`);\n }\n }\n\n // Show board UI access URL\n try {\n const ip = execSync(\"hostname -I | awk '{print $1}'\", {\n encoding: \"utf-8\",\n shell: \"/bin/bash\",\n }).trim();\n info(`Board UI access at: http://${ip}:${port}/board`);\n } catch {\n info(`Board UI access at: http://<server-ip>:${port}/board`);\n }\n } else {\n info(\"Services installed but not started (--no-start).\");\n for (const svc of services) {\n info(` Start ${svc.name}: sudo systemctl start ${svc.name}`);\n }\n }\n\n console.log();\n success(\"Deployment complete!\");\n for (const svc of services) {\n info(` ${svc.name}:`);\n info(` Status: sudo systemctl status ${svc.name}`);\n info(` Logs: sudo journalctl -u ${svc.name} -f`);\n info(` Restart: sudo systemctl restart ${svc.name}`);\n info(` Stop: sudo systemctl stop ${svc.name}`);\n }\n}\n\nasync function deployToAWS(opts: DeployOptions): Promise<void> {\n if (opts.destroy) {\n header(\"BeastMode Cloud Destroy\");\n\n const stackName = \"beastmode-factory\";\n\n // Confirm\n info(\"This will delete ALL BeastMode cloud resources:\");\n info(\" - EC2 instance (all data on the instance will be lost)\");\n info(\" - Elastic IP\");\n info(\" - Security group\");\n info(\" - IAM role and instance profile\");\n info(\" - SSM parameter (board password)\");\n console.log();\n\n // Check if stack exists\n try {\n execSync(`aws cloudformation describe-stacks --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\"\n });\n } catch {\n error(\"No BeastMode stack found. Nothing to destroy.\");\n return;\n }\n\n info(\"Deleting CloudFormation stack...\");\n try {\n execSync(`aws cloudformation delete-stack --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\"\n });\n success(\"Stack deletion initiated\");\n\n info(\"Waiting for deletion to complete (2-5 minutes)...\");\n execSync(`aws cloudformation wait stack-delete-complete --stack-name ${stackName}`, {\n encoding: \"utf-8\", stdio: \"pipe\", timeout: 600000\n });\n success(\"BeastMode cloud deployment destroyed.\");\n } catch (e: any) {\n error(`Failed to delete stack: ${e.message || e.stderr || \"unknown error\"}`);\n }\n return;\n }\n\n header(\"BeastMode Cloud Deploy (AWS)\");\n\n // Check prerequisites\n const anthropicKey = process.env.ANTHROPIC_API_KEY;\n const githubToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n\n if (!anthropicKey) {\n warn(\"ANTHROPIC_API_KEY not set. The daemon will use Claude Code subscription auth.\");\n warn(\"If you haven't run `claude login` yet, SSH into the instance after deploy and run it.\");\n }\n if (!githubToken) {\n error(\"GITHUB_TOKEN not set in environment\");\n process.exit(1);\n }\n\n // Check AWS CLI\n try {\n execSync(\"aws --version\", { encoding: \"utf-8\" });\n } catch {\n error(\"AWS CLI not found. Install: https://aws.amazon.com/cli/\");\n process.exit(1);\n }\n\n // Check AWS credentials\n try {\n execSync(\"aws sts get-caller-identity\", { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"AWS credentials valid\");\n } catch {\n error(\"AWS credentials not configured. Run: aws configure\");\n process.exit(1);\n }\n\n // Find CloudFormation template\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const templatePath = join(__dirname, \"..\", \"..\", \"infra\", \"cloudformation\", \"beastmode.yaml\");\n // Also check relative to current working directory\n const cwdTemplate = join(process.cwd(), \"infra\", \"cloudformation\", \"beastmode.yaml\");\n const template = existsSync(templatePath) ? templatePath : existsSync(cwdTemplate) ? cwdTemplate : null;\n\n if (!template) {\n error(\"CloudFormation template not found. Expected at infra/cloudformation/beastmode.yaml\");\n process.exit(1);\n }\n\n const stackName = \"beastmode-factory\";\n\n info(\"Creating CloudFormation stack...\");\n\n const params = [\n `ParameterKey=GitHubToken,ParameterValue='${githubToken}'`,\n ];\n if (anthropicKey) {\n params.push(`ParameterKey=AnthropicApiKey,ParameterValue='${anthropicKey}'`);\n }\n\n const createCmd = [\n \"aws cloudformation create-stack\",\n `--stack-name ${stackName}`,\n `--template-body file://${template}`,\n \"--capabilities CAPABILITY_IAM\",\n \"--parameters\",\n ...params,\n ].join(\" \");\n\n if (opts.dryRun) {\n info(\"Dry run — would execute:\");\n console.log(createCmd);\n return;\n }\n\n let isUpdate = false;\n try {\n execSync(createCmd, { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"Stack creation initiated\");\n } catch (e: any) {\n const msg = e.stderr || e.message || \"\";\n if (msg.includes(\"AlreadyExistsException\")) {\n if (opts.upgrade) {\n info(\"Stack exists — updating...\");\n try {\n const updateCmd = createCmd.replace(\"create-stack\", \"update-stack\");\n execSync(updateCmd, { encoding: \"utf-8\", stdio: \"pipe\" });\n success(\"Stack update initiated\");\n isUpdate = true;\n } catch (ue: any) {\n const updateMsg = ue.stderr || ue.message || \"\";\n if (updateMsg.includes(\"No updates are to be performed\")) {\n success(\"Stack is already up to date — no changes needed.\");\n // Fall through to show outputs\n } else {\n error(`Failed to update stack: ${updateMsg}`);\n process.exit(1);\n }\n }\n } else {\n warn(\"Stack already exists. Use --upgrade to update it, or delete manually.\");\n process.exit(1);\n }\n } else {\n error(`Failed to create stack: ${msg}`);\n process.exit(1);\n }\n }\n\n // Wait for stack to complete\n const waitAction = isUpdate ? \"update\" : \"create\";\n info(`Waiting for deployment to complete (3-10 minutes)...`);\n\n try {\n execSync(`aws cloudformation wait stack-${waitAction}-complete --stack-name ${stackName}`, {\n encoding: \"utf-8\",\n stdio: \"pipe\",\n timeout: 900000, // 15 min\n });\n success(`Stack ${waitAction} complete`);\n } catch {\n error(`Stack ${waitAction} timed out or failed. Check AWS CloudFormation console.`);\n process.exit(1);\n }\n\n // Get outputs\n try {\n const outputsJson = execSync(\n `aws cloudformation describe-stacks --stack-name ${stackName} --query 'Stacks[0].Outputs' --output json`,\n { encoding: \"utf-8\", stdio: \"pipe\" }\n );\n const outputs = JSON.parse(outputsJson);\n\n console.log();\n header(\"BeastMode Deployed!\");\n console.log();\n\n for (const output of outputs) {\n info(` ${output.OutputKey}: ${output.OutputValue}`);\n }\n\n // Print password retrieval instructions\n const passwordCmd = outputs.find((o: any) => o.OutputKey === \"PasswordCommand\")?.OutputValue;\n if (passwordCmd) {\n console.log();\n info(\" To retrieve the board password:\");\n info(` ${passwordCmd}`);\n } else {\n console.log();\n info(\" To retrieve the board password:\");\n info(` aws ssm get-parameter --name /beastmode/ui-password --with-decryption --query Parameter.Value --output text`);\n }\n\n console.log();\n info(\"To delete: aws cloudformation delete-stack --stack-name beastmode-factory\");\n } catch {\n warn(\"Stack created but could not retrieve outputs. Check AWS Console.\");\n }\n}\n","import { Command } from \"commander\";\nimport { spawnSync } from \"child_process\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { header, success, info, warn, error } from \"../utils/display.js\";\n\ninterface UpOptions {\n pull?: boolean;\n cwd?: string;\n}\n\nconst LAUNCH_AGENT_LABEL = \"com.develeap.beastmode.claude-creds\";\nconst SYSTEMD_CREDS_TIMER = \"beastmode-claude-creds.timer\";\n\n/** Auto-install the credential sync watcher if it isn't already running.\n *\n * On macOS this is the launchd LaunchAgent; on Linux it's a systemd\n * user timer. Both rely on the same install paths used by\n * ``beastmode init``. The check is best-effort: a missing watcher\n * does not block ``beastmode up`` (the user can still run via\n * ``ANTHROPIC_API_KEY`` or fix it later), so install failures only\n * print a warning. */\nasync function ensureCredWatcher(cwd: string): Promise<void> {\n const plat = process.platform;\n if (plat !== \"darwin\" && plat !== \"linux\") return;\n\n // Cheap probe — `launchctl print` / `systemctl is-active` exits 0\n // when the watcher is already loaded. Skip the install in that case\n // so we don't spam users with messages on every `beastmode up`.\n if (plat === \"darwin\") {\n const uid = process.getuid?.();\n const probe = spawnSync(\n \"launchctl\",\n [\"print\", `gui/${uid}/${LAUNCH_AGENT_LABEL}`],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if (probe.status === 0) return;\n } else {\n const probe = spawnSync(\n \"systemctl\",\n [\"--user\", \"is-active\", SYSTEMD_CREDS_TIMER],\n { stdio: \"pipe\", encoding: \"utf-8\" },\n );\n if ((probe.stdout || \"\").trim() === \"active\") return;\n }\n\n info(\"Installing credential sync watcher for Docker daemon...\");\n try {\n if (plat === \"darwin\") {\n const { syncClaudeCredsOnce, installAgent } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsOnce();\n if (\"error\" in sync) {\n warn(`Credential sync skipped: ${sync.error}`);\n info(\n \" Run `beastmode sync-claude-creds --install` after `claude login`.\",\n );\n return;\n }\n success(`Credentials synced: ${sync.path}`);\n installAgent(1800, { throwOnError: true, factoryDir: cwd });\n } else {\n const { syncClaudeCredsLinux, installAgentLinux } = await import(\n \"./sync-claude-creds.js\"\n );\n const sync = syncClaudeCredsLinux();\n if (\"error\" in sync) {\n warn(`Credential sync skipped: ${sync.error}`);\n info(\n \" Run `beastmode sync-claude-creds --install` after `claude login`.\",\n );\n return;\n }\n success(`Credentials valid: ${sync.path}`);\n installAgentLinux(1800, { throwOnError: true });\n }\n } catch (e) {\n warn(\n `Credential watcher install failed: ${\n e instanceof Error ? e.message : String(e)\n }`,\n );\n info(\" Service startup continues — re-try with `beastmode sync-claude-creds --install`.\");\n }\n}\n\nexport async function runUp(opts: UpOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n requireComposeFile(cwd);\n\n if (opts.pull) {\n runCompose([\"pull\"], { cwd, inherit: true });\n }\n\n runCompose([\"up\", \"-d\"], { cwd, inherit: true });\n\n // Best-effort credential-watcher install. Runs after services are up\n // so a startup failure here doesn't leave the user with a half-up\n // factory; ANTHROPIC_API_KEY users skip implicitly because the\n // sync routines read the credentials file (which doesn't exist for\n // pure-API-key setups).\n await ensureCredWatcher(cwd);\n}\n\nexport const upCommand = new Command(\"up\")\n .description(\"Start BeastMode services\")\n .option(\"--pull\", \"Pull latest images before starting\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Up\");\n await runUp(opts);\n console.log();\n success(\"BeastMode is running\");\n info(` Board UI: http://localhost:${process.env.UI_PORT || \"8420\"}`);\n info(\" Logs: beastmode logs\");\n info(\" Stop: beastmode down\");\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport inquirer from \"inquirer\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { header, success, warn, error } from \"../utils/display.js\";\n\ninterface DownOptions {\n volumes?: boolean;\n cwd?: string;\n skipConfirm?: boolean;\n}\n\nexport async function runDown(opts: DownOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n requireComposeFile(cwd);\n\n const args = [\"down\"];\n\n if (opts.volumes) {\n if (!opts.skipConfirm) {\n const { confirm } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"confirm\",\n message: \"This will delete all persistent data (board DB, runs, logs). Continue?\",\n default: false,\n },\n ]);\n if (!confirm) {\n warn(\"Aborted — data preserved\");\n return;\n }\n }\n args.push(\"--volumes\");\n }\n\n runCompose(args, { cwd, inherit: true });\n}\n\nexport const downCommand = new Command(\"down\")\n .description(\"Stop BeastMode services\")\n .option(\"--volumes\", \"Also remove persistent data (board DB, runs, logs)\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Down\");\n await runDown(opts);\n success(\"BeastMode stopped\");\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { requireComposeFile, runCompose } from \"../utils/docker.js\";\nimport { error } from \"../utils/display.js\";\n\nconst VALID_SERVICES = [\"board\", \"ui\", \"daemon\"];\n\ninterface LogsOpts {\n service?: string;\n tail?: string;\n}\n\nexport function buildLogsArgs(opts: LogsOpts): string[] {\n const args = [\"logs\", \"-f\", \"--tail\", opts.tail ?? \"100\"];\n\n if (opts.service) {\n if (!VALID_SERVICES.includes(opts.service)) {\n throw new Error(\n `Unknown service \"${opts.service}\". Valid services: ${VALID_SERVICES.join(\", \")}`\n );\n }\n args.push(opts.service);\n }\n\n return args;\n}\n\nexport const logsCommand = new Command(\"logs\")\n .description(\"Stream BeastMode service logs\")\n .argument(\"[service]\", \"Service to show logs for (board, ui, daemon)\")\n .option(\"--tail <n>\", \"Number of lines to show\", \"100\")\n .action(async (service, opts) => {\n try {\n requireComposeFile(process.cwd());\n const args = buildLogsArgs({ service, tail: opts.tail });\n runCompose(args, { inherit: true });\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { readFileSync, writeFileSync } from \"fs\";\nimport { requireComposeFile, runCompose, GHCR_IMAGE_PREFIX } from \"../utils/docker.js\";\nimport { header, success, info, error } from \"../utils/display.js\";\n\ninterface UpdateOptions {\n tag?: string;\n cwd?: string;\n}\n\nexport async function runUpdate(opts: UpdateOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n const composePath = requireComposeFile(cwd);\n\n if (opts.tag) {\n // Rewrite image tags in docker-compose.yml\n let content = readFileSync(composePath, \"utf-8\");\n const tagPattern = new RegExp(\n `(${GHCR_IMAGE_PREFIX.replace(/[/]/g, \"\\\\/\")}\\\\/(?:board|daemon|ui)):([\\\\w.\\\\-]+)`,\n \"g\"\n );\n content = content.replace(tagPattern, `$1:${opts.tag}`);\n writeFileSync(composePath, content, \"utf-8\");\n }\n\n runCompose([\"pull\"], { cwd, inherit: true });\n runCompose([\"up\", \"-d\"], { cwd, inherit: true });\n}\n\nexport const updateCommand = new Command(\"update\")\n .description(\"Pull latest BeastMode images and restart\")\n .option(\"--tag <version>\", \"Pin to a specific version (e.g. 1.2.3)\")\n .action(async (opts) => {\n try {\n header(\"BeastMode Update\");\n info(\"Pulling latest images...\");\n await runUpdate(opts);\n console.log();\n success(\"BeastMode updated and restarted\");\n if (opts.tag) {\n info(` Pinned to version: ${opts.tag}`);\n }\n } catch (err) {\n error((err as Error).message);\n process.exit(1);\n }\n });\n","import { Command } from \"commander\";\nimport { spawn } from \"child_process\";\nimport { existsSync, readdirSync, readFileSync } from \"fs\";\nimport { basename, join, resolve } from \"path\";\nimport { error, header, info, success, warn } from \"../utils/display.js\";\nimport {\n buildRunnerImage,\n detectRunnerStack,\n findLockfiles,\n} from \"../runner-image-builder.js\";\nimport {\n createRegistrationToken,\n deleteRunner,\n listRunners,\n resolveGitHubConfig,\n} from \"../github-runners.js\";\nimport {\n containerIsHealthy,\n findContainerByName,\n pullImageIfNeeded,\n pollUntilOnline,\n removeContainer,\n removeEnvEntries,\n resolveRepoSlug,\n setupStep,\n startRunnerContainer,\n writeEnvEntries,\n writeRunnerMeta,\n} from \"../runner-helpers.js\";\nimport { nativeRunnerSetup } from \"../native-runner.js\";\nimport {\n restoreWorkflows,\n switchWorkflows,\n} from \"../workflow-switcher.js\";\n\nexport const runnerCommand = new Command(\"runner\")\n .description(\"Manage self-hosted GitHub Actions runners\");\n\nexport interface RunnerSetupOpts {\n repo?: string;\n name: string;\n label: string;\n native?: boolean;\n service?: boolean;\n dryRun?: boolean;\n buildImage?: boolean;\n projectDir?: string;\n}\n\n/**\n * Resolve the project name to use as the image-tag prefix. Prefer the\n * registered name in `.beastmode/projects/*.json` whose `path` matches\n * `projectDir`; fall back to the directory's basename so unregistered\n * projects still build a stable, predictable tag.\n */\nexport function resolveProjectName(projectDir: string): string {\n const projectsDir = join(projectDir, \".beastmode\", \"projects\");\n if (existsSync(projectsDir)) {\n try {\n for (const entry of readdirSync(projectsDir)) {\n if (!entry.endsWith(\".json\")) continue;\n const file = join(projectsDir, entry);\n try {\n const raw = readFileSync(file, \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n if (\n typeof data.path === \"string\" &&\n resolve(data.path) === resolve(projectDir) &&\n typeof data.name === \"string\" &&\n data.name.length > 0\n ) {\n return data.name;\n }\n } catch {\n // Corrupt or unreadable project.json — fall through to the\n // next candidate.\n }\n }\n } catch {\n // Directory race / permission error — fall back to basename.\n }\n }\n return basename(resolve(projectDir));\n}\n\nexport async function runnerSetupAction(\n opts: RunnerSetupOpts,\n): Promise<void> {\n if (opts.service !== undefined && !opts.native) {\n throw new Error(\n \"--service requires --native. The Docker runner always runs as a container service.\",\n );\n }\n\n if (opts.buildImage && opts.native) {\n throw new Error(\n \"Custom image builds require Docker mode. --build-image is incompatible with --native.\",\n );\n }\n\n if (opts.native) {\n await nativeRunnerSetup(opts);\n return;\n }\n\n const ghConfig = resolveGitHubConfig();\n const repoSlug = opts.repo ?? resolveRepoSlug();\n\n setupStep(\"Generating registration token via GitHub API...\");\n if (opts.dryRun) {\n info(`[dry-run] Would start container '${opts.name}' for repo ${repoSlug}`);\n return;\n }\n\n const { token: regToken } = await createRegistrationToken(ghConfig);\n\n setupStep(\"Pulling myoung34/github-runner:latest...\");\n await pullImageIfNeeded(\"myoung34/github-runner:latest\");\n\n const existing = await findContainerByName(opts.name);\n if (existing) {\n if (containerIsHealthy(existing)) {\n success(`Runner container '${opts.name}' already running — reusing.`);\n return;\n }\n setupStep(\n `Container '${opts.name}' exists but is dead — removing and recreating...`,\n );\n await removeContainer(opts.name);\n }\n\n const repoUrl = `https://github.com/${ghConfig.owner}/${ghConfig.repo}`;\n setupStep(\"Starting runner container...\");\n await startRunnerContainer({\n name: opts.name,\n repoUrl,\n token: regToken,\n labels: [\"self-hosted\", opts.label],\n });\n\n await writeEnvEntries({\n RUNNER_REPO_URL: repoUrl,\n RUNNER_TOKEN: regToken,\n RUNNER_NAME: opts.name,\n });\n\n setupStep(\"Waiting for runner to appear online on GitHub (timeout 60s)...\");\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n\n if (opts.buildImage) {\n try {\n const projectDir = resolve(opts.projectDir ?? process.cwd());\n const stack = detectRunnerStack(projectDir);\n const lockfiles = findLockfiles(projectDir, stack.name);\n if (lockfiles.length === 0) {\n info(\n `No lockfiles detected for stack \"${stack.name}\" — skipping custom image build.`,\n );\n } else {\n setupStep(\n `Building custom runner image (stack: ${stack.name}, lockfiles: ${lockfiles.join(\", \")})...`,\n );\n const projectName = resolveProjectName(projectDir);\n const result = buildRunnerImage({\n projectDir,\n projectName,\n stack,\n lockfiles,\n });\n setupStep(\n `Restarting container '${opts.name}' on custom image ${result.imageTag}...`,\n );\n await removeContainer(opts.name);\n await startRunnerContainer({\n name: opts.name,\n repoUrl,\n token: regToken,\n labels: [\"self-hosted\", opts.label],\n image: result.imageTag,\n });\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n success(`Runner now using custom image: ${result.imageTag}`);\n }\n } catch (err: any) {\n warn(\n `Custom image build failed — runner staying on base image. Reason: ${\n err?.message ? String(err.message) : String(err)\n }`,\n );\n }\n }\n\n setupStep(\"Adding runner to docker-compose...\");\n await composeUpRunner();\n\n // Write Docker runner metadata so /api/debug/runner can report mode.\n // Lives at .beastmode/runner-meta.json — token-free by design.\n await writeRunnerMeta(\".beastmode\", {\n name: opts.name,\n mode: \"docker\",\n platform: process.platform,\n arch: process.arch,\n service: true,\n installedAt: new Date().toISOString(),\n });\n\n success(`Runner '${opts.name}' registered and online.`);\n}\n\nasync function composeUpRunner(): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\n \"docker\",\n [\"compose\", \"--profile\", \"runner\", \"up\", \"-d\", \"runner\"],\n { stdio: [\"ignore\", \"inherit\", \"inherit\"] },\n );\n child.on(\"error\", (err) => reject(err));\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else\n reject(\n new Error(\n `docker compose --profile runner up -d runner exited with code ${code}`,\n ),\n );\n });\n });\n}\n\nrunnerCommand\n .command(\"setup\")\n .description(\"Set up a self-hosted GitHub Actions runner (Docker-Linux by default)\")\n .option(\"--repo <owner/repo>\", \"GitHub repo for runner registration\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--label <label>\", \"Additional runner label\", \"beastmode\")\n .option(\"--dry-run\", \"Print what would happen without mutating state\")\n .option(\n \"--native\",\n \"Use native runner binary instead of Docker (downloads actions/runner)\",\n )\n .option(\n \"--service\",\n \"Install as background service (systemd/launchd). Requires --native.\",\n )\n .option(\n \"--build-image\",\n \"Build a custom runner image with pre-installed project dependencies\",\n false,\n )\n .option(\n \"--project-dir <path>\",\n \"Project root used to detect stack for --build-image\",\n process.cwd(),\n )\n .action(async (opts: RunnerSetupOpts) => {\n try {\n await runnerSetupAction(opts);\n } catch (err: any) {\n error(err?.message ? String(err.message) : String(err));\n process.exitCode = 1;\n }\n });\n\nexport interface RunnerStatusOpts {\n name: string;\n json?: boolean;\n}\n\nexport async function runnerStatusAction(\n opts: RunnerStatusOpts,\n): Promise<void> {\n const container = await findContainerByName(opts.name);\n const containerStatus = container ? container.status : null;\n\n let ghRunner:\n | {\n id: number;\n name: string;\n os: string;\n status: string;\n busy: boolean;\n labels: Array<{ name: string }>;\n }\n | null = null;\n let ghError: string | null = null;\n try {\n const ghConfig = resolveGitHubConfig();\n const list = await listRunners(ghConfig);\n ghRunner = list.runners.find((r) => r.name === opts.name) ?? null;\n } catch (err: any) {\n ghError = err?.message ? String(err.message) : String(err);\n }\n\n if (opts.json) {\n const result: Record<string, any> = {\n name: opts.name,\n container: { found: !!container, status: containerStatus },\n };\n if (ghRunner) {\n result.github = {\n registered: true,\n id: ghRunner.id,\n status: ghRunner.status,\n busy: ghRunner.busy,\n os: ghRunner.os,\n labels: ghRunner.labels.map((l) => l.name),\n };\n } else if (ghError) {\n result.github = { registered: null, error: ghError };\n } else {\n result.github = {\n registered: false,\n id: null,\n status: null,\n busy: null,\n os: null,\n labels: [],\n };\n }\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n header(`Runner Status: ${opts.name}`);\n\n if (container && containerIsHealthy(container)) {\n success(`Container: ${container.status}`);\n } else if (container) {\n error(`Container: ${container.status}`);\n } else {\n error(\"Container: not found\");\n }\n\n if (ghRunner) {\n const busySuffix = ghRunner.busy ? \" — busy\" : \"\";\n if (ghRunner.status === \"online\") {\n success(`GitHub: online (id: ${ghRunner.id})${busySuffix}`);\n } else {\n warn(`GitHub: ${ghRunner.status} (id: ${ghRunner.id})${busySuffix}`);\n }\n info(`Labels: ${ghRunner.labels.map((l) => l.name).join(\", \")}`);\n info(`OS: ${ghRunner.os}`);\n info(`Busy: ${ghRunner.busy ? \"yes\" : \"no\"}`);\n } else if (ghError) {\n warn(`GitHub: could not reach API (${ghError})`);\n } else {\n error(\"GitHub: not registered\");\n }\n}\n\nexport interface RunnerRemoveOpts {\n name: string;\n force?: boolean;\n}\n\nexport async function runnerRemoveAction(\n opts: RunnerRemoveOpts,\n): Promise<void> {\n header(`Removing runner: ${opts.name}`);\n\n let ghDeregistrationFailed = false;\n let ghWarning: string | null = null;\n\n try {\n const ghConfig = resolveGitHubConfig();\n const list = await listRunners(ghConfig);\n const runner = list.runners.find((r) => r.name === opts.name);\n\n if (!runner) {\n ghWarning = \"not registered (nothing to deregister)\";\n } else {\n if (runner.busy && !opts.force) {\n warn(`Runner '${opts.name}' is currently busy (running a job).`);\n info(\"Use --force to remove anyway.\");\n return;\n }\n try {\n await deleteRunner(ghConfig, runner.id);\n success(`Deregistered from GitHub (runner id: ${runner.id})`);\n } catch (err: any) {\n ghDeregistrationFailed = true;\n ghWarning = `deregistration failed: ${err?.message ?? String(err)}`;\n }\n }\n } catch (err: any) {\n ghDeregistrationFailed = true;\n ghWarning = err?.message ? String(err.message) : String(err);\n }\n\n if (ghWarning) {\n warn(`GitHub: ${ghWarning}`);\n }\n\n let containerWarning: string | null = null;\n try {\n const container = await findContainerByName(opts.name);\n if (!container) {\n containerWarning = \"not found (nothing to remove)\";\n } else {\n try {\n await removeContainer(opts.name);\n success(\"Container removed\");\n } catch (err: any) {\n containerWarning = err?.message ? String(err.message) : String(err);\n }\n }\n } catch (err: any) {\n containerWarning = err?.message ? String(err.message) : String(err);\n }\n\n if (containerWarning) {\n warn(`Container: ${containerWarning}`);\n }\n\n await removeEnvEntries([\"RUNNER_REPO_URL\", \"RUNNER_TOKEN\", \"RUNNER_NAME\"]);\n success(\".env entries cleaned (RUNNER_REPO_URL, RUNNER_TOKEN, RUNNER_NAME)\");\n\n if (ghDeregistrationFailed) {\n warn(\n `Runner '${opts.name}' partially removed (GitHub deregistration failed).`,\n );\n } else {\n success(`Runner '${opts.name}' fully removed.`);\n }\n}\n\nrunnerCommand\n .command(\"status\")\n .description(\"Show runner status (container + GitHub registration)\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .action(async (opts: RunnerStatusOpts) => {\n try {\n await runnerStatusAction(opts);\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"remove\")\n .description(\"Remove the runner (container + GitHub deregistration)\")\n .option(\"--name <name>\", \"Container + runner name\", \"beastmode-runner\")\n .option(\"--force\", \"Remove even if the runner is busy\")\n .action(async (opts: RunnerRemoveOpts) => {\n try {\n await runnerRemoveAction(opts);\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"switch-workflows\")\n .description(\"Switch workflow runs-on to self-hosted runner\")\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .action(async (opts) => {\n const projectDir = resolve(opts.projectDir);\n try {\n const result = await switchWorkflows(projectDir);\n if (result.alreadySwitched) {\n info(\"Workflows already switched — nothing to do.\");\n return;\n }\n header(\"Switched workflows to self-hosted runner\");\n for (const file of result.files) {\n success(`${file.relativePath}: ${file.jobCount} job(s) switched`);\n }\n info(\"State saved to .beastmode/runner-workflow-state.json\");\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\nrunnerCommand\n .command(\"restore-workflows\")\n .description(\"Restore workflows to original runs-on values\")\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .action(async (opts) => {\n const projectDir = resolve(opts.projectDir);\n try {\n const result = await restoreWorkflows(projectDir);\n if (result.nothingToRestore) {\n info(\"Nothing to restore.\");\n return;\n }\n header(\"Restored workflows to original runs-on values\");\n for (const file of result.files) {\n success(`${file.relativePath}: ${file.jobCount} job(s) restored`);\n }\n info(\"State file removed.\");\n } catch (err: any) {\n error(err.message);\n process.exitCode = 1;\n }\n });\n\ninterface RunnerBuildImageOpts {\n projectDir: string;\n force?: boolean;\n dryRun?: boolean;\n}\n\nexport async function runnerBuildImageAction(\n opts: RunnerBuildImageOpts,\n): Promise<void> {\n const projectDir = resolve(opts.projectDir);\n if (!existsSync(projectDir)) {\n throw new Error(`Project directory not found: ${projectDir}`);\n }\n const stack = detectRunnerStack(projectDir);\n const lockfiles = findLockfiles(projectDir, stack.name);\n\n if (lockfiles.length === 0) {\n info(\n `No lockfiles detected for stack \"${stack.name}\" — skipping dependency layer.`,\n );\n return;\n }\n\n const projectName = resolveProjectName(projectDir);\n const result = buildRunnerImage({\n projectDir,\n projectName,\n stack,\n lockfiles,\n force: opts.force,\n dryRun: opts.dryRun,\n });\n\n if (opts.dryRun) {\n header(\"Dry run: Dockerfile\");\n process.stdout.write(result.dockerfile);\n info(`Image would be tagged: ${result.imageTag}`);\n return;\n }\n\n success(\n `Stack detected: ${stack.name} (lockfiles: ${lockfiles.join(\", \")})`,\n );\n if (result.built) {\n success(`Runner image built: ${result.imageTag}`);\n } else {\n info(`Runner image already up-to-date: ${result.imageTag}`);\n }\n info(`Lockfile hash: ${result.lockfileHash}`);\n}\n\nrunnerCommand\n .command(\"build-image\")\n .description(\n \"Build a custom runner image with pre-installed project dependencies\",\n )\n .option(\"--project-dir <path>\", \"Project root directory\", process.cwd())\n .option(\"--force\", \"Rebuild even if lockfiles unchanged\", false)\n .option(\"--dry-run\", \"Print Dockerfile without building\", false)\n .action(async (opts: RunnerBuildImageOpts) => {\n try {\n await runnerBuildImageAction(opts);\n } catch (err: any) {\n error(err?.message ? String(err.message) : String(err));\n process.exitCode = 1;\n }\n });\n","/**\n * Build a per-project runner image with pre-installed dependency layers.\n *\n * Wraps `docker build` with stack-aware Dockerfile generation. The\n * generated image FROMs `myoung34/github-runner:latest`, layers in the\n * runtime (node/python/go/etc), copies the project's lockfiles, and\n * runs the appropriate dependency install command so subsequent CI\n * jobs skip a cold install.\n *\n * State is persisted to two files inside `.beastmode/runner/`:\n * - `last-build.json` — last successful build's lockfile hash + tag\n * (used by `shouldRebuild` to skip work when nothing changed)\n * - `runner-layers.json` — public observability snapshot consumed by\n * the board's `/api/debug/runner-layers` endpoint\n */\n\nimport { execSync } from \"child_process\";\nimport { createHash } from \"crypto\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from \"fs\";\nimport { join } from \"path\";\n\nimport {\n detectRunnerStack,\n findLockfiles,\n RunnerStack,\n} from \"./stack-detect.js\";\n\nexport { detectRunnerStack, findLockfiles };\nexport type { RunnerStack };\n\nexport interface BuildRunnerImageOpts {\n projectDir: string;\n projectName: string;\n stack: RunnerStack;\n lockfiles: string[];\n /** Rebuild even when `last-build.json` has the same lockfile hash. */\n force?: boolean;\n /** Print the Dockerfile + tag without invoking docker. */\n dryRun?: boolean;\n}\n\nexport interface BuildRunnerImageResult {\n imageTag: string;\n lockfileHash: string;\n dockerfile: string;\n built: boolean;\n}\n\nexport interface LastBuild {\n lockfileHash: string;\n imageTag: string;\n builtAt: string;\n}\n\nconst RUNNER_STATE_DIR = \".beastmode/runner\";\nconst LAST_BUILD_FILE = \"last-build.json\";\nconst LAYERS_FILE = \"runner-layers.json\";\n\n/**\n * Map a (stack, lockfile) pair to the install command. The first match\n * wins so callers should pass lockfiles in the canonical preference\n * order returned by `findLockfiles`.\n */\nexport function getDependencyInstallCommand(\n stack: RunnerStack,\n lockfiles: string[],\n): string | null {\n if (lockfiles.length === 0) return null;\n\n const has = (name: string) => lockfiles.includes(name);\n\n if (stack.language === \"node\") {\n if (has(\"pnpm-lock.yaml\")) return \"pnpm install --frozen-lockfile\";\n if (has(\"yarn.lock\")) return \"yarn install --frozen-lockfile\";\n if (has(\"bun.lockb\")) return \"bun install --frozen-lockfile\";\n if (has(\"package-lock.json\")) return \"npm ci\";\n if (has(\"package.json\")) return \"npm install\";\n return null;\n }\n\n if (stack.language === \"python\") {\n if (has(\"poetry.lock\")) return \"poetry install --no-interaction --no-root\";\n if (has(\"uv.lock\")) return \"uv sync --frozen\";\n if (has(\"Pipfile.lock\")) return \"pipenv install --deploy\";\n if (has(\"requirements.txt\")) return \"pip install -r requirements.txt\";\n if (has(\"pyproject.toml\")) return \"pip install .\";\n return null;\n }\n\n if (stack.language === \"go\") {\n if (has(\"go.mod\")) return \"go mod download\";\n return null;\n }\n\n if (stack.language === \"rust\") {\n if (has(\"Cargo.lock\") || has(\"Cargo.toml\")) return \"cargo fetch\";\n return null;\n }\n\n if (stack.language === \"java\") {\n if (stack.name === \"java-maven\" && has(\"pom.xml\")) {\n return \"mvn -B -q dependency:go-offline\";\n }\n if (\n stack.name === \"java-gradle\" &&\n (has(\"build.gradle\") || has(\"build.gradle.kts\"))\n ) {\n return \"./gradlew --no-daemon dependencies || true\";\n }\n return null;\n }\n\n return null;\n}\n\nfunction runtimeInstallBlock(stack: RunnerStack): string {\n switch (stack.language) {\n case \"node\":\n return [\n \"RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \\\\\",\n \" && apt-get install -y --no-install-recommends nodejs \\\\\",\n \" && npm install -g pnpm yarn \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n case \"python\":\n return [\n \"RUN apt-get update \\\\\",\n \" && apt-get install -y --no-install-recommends python3 python3-pip python3-venv \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n case \"go\":\n return [\n \"RUN curl -fsSL https://go.dev/dl/go1.22.0.linux-amd64.tar.gz \\\\\",\n \" | tar -C /usr/local -xz\",\n \"ENV PATH=\\\"/usr/local/go/bin:${PATH}\\\"\",\n ].join(\"\\n\");\n case \"rust\":\n return [\n \"RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \\\\\",\n \" | sh -s -- -y --default-toolchain stable\",\n \"ENV PATH=\\\"/root/.cargo/bin:${PATH}\\\"\",\n ].join(\"\\n\");\n case \"java\":\n return [\n \"RUN apt-get update \\\\\",\n \" && apt-get install -y --no-install-recommends openjdk-17-jdk-headless maven gradle \\\\\",\n \" && rm -rf /var/lib/apt/lists/*\",\n ].join(\"\\n\");\n default:\n return \"# no runtime block for unknown language\";\n }\n}\n\n/**\n * Render a Dockerfile that bakes in the runtime + project dependencies.\n * Pure string output — no I/O. Tested directly.\n */\nexport function generateDockerfile(\n stack: RunnerStack,\n lockfiles: string[],\n): string {\n const lines: string[] = [];\n lines.push(\"FROM myoung34/github-runner:latest\");\n lines.push(\"USER root\");\n lines.push(\"WORKDIR /opt/runner-deps\");\n lines.push(runtimeInstallBlock(stack));\n\n if (lockfiles.length > 0) {\n for (const lf of lockfiles) {\n lines.push(`COPY ${lf} ./${lf}`);\n }\n const installCmd = getDependencyInstallCommand(stack, lockfiles);\n if (installCmd) {\n lines.push(`RUN ${installCmd}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Stable 16-char hex hash of the lockfile contents (sha256 prefix).\n * Used as the image tag and the cache key in `last-build.json`.\n *\n * Files are read in the order supplied; missing files contribute the\n * literal string `<missing>` so a deletion still busts the cache.\n */\nexport function computeLockfileHash(\n projectDir: string,\n lockfiles: string[],\n): string {\n const hash = createHash(\"sha256\");\n for (const lf of lockfiles) {\n const path = join(projectDir, lf);\n hash.update(lf);\n hash.update(\"\\0\");\n if (existsSync(path)) {\n try {\n hash.update(readFileSync(path));\n } catch {\n hash.update(\"<unreadable>\");\n }\n } else {\n hash.update(\"<missing>\");\n }\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\").slice(0, 16);\n}\n\n/**\n * Read `last-build.json` for `projectDir`. Returns null when missing or\n * unparseable (corrupt files are treated as cache misses, never errors).\n */\nexport function readLastBuild(projectDir: string): LastBuild | null {\n const path = join(projectDir, RUNNER_STATE_DIR, LAST_BUILD_FILE);\n if (!existsSync(path)) return null;\n try {\n const data = JSON.parse(readFileSync(path, \"utf-8\"));\n if (\n data &&\n typeof data === \"object\" &&\n typeof data.lockfileHash === \"string\" &&\n typeof data.imageTag === \"string\" &&\n typeof data.builtAt === \"string\"\n ) {\n return data as LastBuild;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/**\n * True when a rebuild is required. Rebuilds when:\n * - There is no `last-build.json` (first run)\n * - The stored lockfile hash differs from the current one\n * - The file is corrupt or malformed (treated as cache miss)\n */\nexport function shouldRebuild(\n projectDir: string,\n currentHash: string,\n): boolean {\n const last = readLastBuild(projectDir);\n if (!last) return true;\n return last.lockfileHash !== currentHash;\n}\n\nfunction imageTagFor(projectName: string, hash: string): string {\n const safeName = projectName.toLowerCase().replace(/[^a-z0-9_-]/g, \"-\");\n return `beastmode-runner-${safeName}:${hash}`;\n}\n\nfunction writeStateFile(\n projectDir: string,\n fileName: string,\n payload: unknown,\n): void {\n const dir = join(projectDir, RUNNER_STATE_DIR);\n mkdirSync(dir, { recursive: true });\n writeFileSync(\n join(dir, fileName),\n JSON.stringify(payload, null, 2) + \"\\n\",\n \"utf-8\",\n );\n}\n\n/**\n * Build (or skip) the runner image and persist the layer metadata.\n *\n * Returns `built: false` when the cached image is still valid and\n * `force` was not requested — the tag is still returned so callers can\n * use it without checking. Throws \"Docker is required for runner\n * image builds\" when `docker build` is not installed.\n */\nexport function buildRunnerImage(\n opts: BuildRunnerImageOpts,\n): BuildRunnerImageResult {\n const { projectDir, projectName, stack, lockfiles, force, dryRun } = opts;\n\n if (!existsSync(projectDir)) {\n throw new Error(`Project directory not found: ${projectDir}`);\n }\n\n const lockfileHash = computeLockfileHash(projectDir, lockfiles);\n const imageTag = imageTagFor(projectName, lockfileHash);\n const dockerfile = generateDockerfile(stack, lockfiles);\n\n if (dryRun) {\n return { imageTag, lockfileHash, dockerfile, built: false };\n }\n\n if (!force && !shouldRebuild(projectDir, lockfileHash)) {\n return { imageTag, lockfileHash, dockerfile, built: false };\n }\n\n try {\n execSync(\n `docker build -t ${imageTag} -f - ${projectDir}`,\n {\n input: dockerfile,\n stdio: [\"pipe\", \"inherit\", \"inherit\"],\n },\n );\n } catch (err) {\n const e = err as NodeJS.ErrnoException;\n if (e && e.code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for runner image builds. Install Docker and retry.\",\n );\n }\n const msg = (err as Error)?.message ?? String(err);\n throw new Error(`docker build failed: ${msg}`);\n }\n\n const builtAt = new Date().toISOString();\n writeStateFile(projectDir, LAST_BUILD_FILE, {\n lockfileHash,\n imageTag,\n builtAt,\n } satisfies LastBuild);\n\n writeStateFile(projectDir, LAYERS_FILE, {\n project: projectName,\n stack: stack.name,\n lockfile_hash: lockfileHash,\n image_tag: imageTag,\n lockfiles,\n built_at: builtAt,\n });\n\n return { imageTag, lockfileHash, dockerfile, built: true };\n}\n","/**\n * Runner-image stack detection.\n *\n * Detects the dominant language/framework of a project so the runner image\n * builder can pre-install the right runtime + dependency layers. Distinct\n * from `engine/stack-detector.ts` (which produces a richer StackInfo for\n * scaffolding) — this module is intentionally narrow: name + language +\n * the lockfile globs to copy into the image.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\n\nexport interface RunnerStack {\n /** Identifier — matches the keys used by runner-image-builder. */\n name: string;\n /** Top-level language family used for runtime selection. */\n language: string;\n}\n\nconst NODE_LOCKFILES = [\n \"package-lock.json\",\n \"pnpm-lock.yaml\",\n \"yarn.lock\",\n \"bun.lockb\",\n \"package.json\",\n];\n\nconst PYTHON_LOCKFILES = [\n \"poetry.lock\",\n \"uv.lock\",\n \"Pipfile.lock\",\n \"requirements.txt\",\n \"pyproject.toml\",\n];\n\nconst GO_LOCKFILES = [\"go.mod\", \"go.sum\"];\n\nconst RUST_LOCKFILES = [\"Cargo.lock\", \"Cargo.toml\"];\n\nconst JAVA_MAVEN_LOCKFILES = [\"pom.xml\"];\n\nconst JAVA_GRADLE_LOCKFILES = [\n \"build.gradle\",\n \"build.gradle.kts\",\n \"gradle.lockfile\",\n];\n\nconst STACK_LOCKFILES: Record<string, string[]> = {\n nextjs: NODE_LOCKFILES,\n vite: NODE_LOCKFILES,\n react: NODE_LOCKFILES,\n node: NODE_LOCKFILES,\n fastapi: PYTHON_LOCKFILES,\n django: PYTHON_LOCKFILES,\n python: PYTHON_LOCKFILES,\n go: GO_LOCKFILES,\n rust: RUST_LOCKFILES,\n \"java-maven\": JAVA_MAVEN_LOCKFILES,\n \"java-gradle\": JAVA_GRADLE_LOCKFILES,\n};\n\nfunction readFileSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\nfunction parseJsonSafe(content: string): Record<string, unknown> | null {\n try {\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * Identify the project's stack for runner image purposes.\n *\n * Detection order — the first match wins:\n * 1. Node-family via `package.json` (next → nextjs, vite → vite,\n * react-scripts → react, otherwise → node)\n * 2. Python-family (manage.py → django, pyproject.toml mentioning\n * fastapi → fastapi, otherwise pyproject/requirements → python)\n * 3. go.mod → go\n * 4. Cargo.toml → rust\n * 5. pom.xml → java-maven\n * 6. build.gradle{,.kts} → java-gradle\n *\n * Falls back to `node` for empty/unrecognised directories so the runner\n * image still gets a usable JavaScript runtime baseline.\n */\nexport function detectRunnerStack(projectDir: string): RunnerStack {\n const pkgContent = readFileSafe(join(projectDir, \"package.json\"));\n if (pkgContent) {\n const pkg = parseJsonSafe(pkgContent);\n if (pkg) {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n if (deps.next) return { name: \"nextjs\", language: \"node\" };\n if (deps.vite) return { name: \"vite\", language: \"node\" };\n if (deps[\"react-scripts\"]) return { name: \"react\", language: \"node\" };\n }\n return { name: \"node\", language: \"node\" };\n }\n\n if (existsSync(join(projectDir, \"manage.py\"))) {\n return { name: \"django\", language: \"python\" };\n }\n const pyproject = readFileSafe(join(projectDir, \"pyproject.toml\"));\n if (pyproject) {\n if (pyproject.toLowerCase().includes(\"fastapi\")) {\n return { name: \"fastapi\", language: \"python\" };\n }\n return { name: \"python\", language: \"python\" };\n }\n if (existsSync(join(projectDir, \"requirements.txt\"))) {\n return { name: \"python\", language: \"python\" };\n }\n\n if (existsSync(join(projectDir, \"go.mod\"))) {\n return { name: \"go\", language: \"go\" };\n }\n if (existsSync(join(projectDir, \"Cargo.toml\"))) {\n return { name: \"rust\", language: \"rust\" };\n }\n if (existsSync(join(projectDir, \"pom.xml\"))) {\n return { name: \"java-maven\", language: \"java\" };\n }\n if (\n existsSync(join(projectDir, \"build.gradle\")) ||\n existsSync(join(projectDir, \"build.gradle.kts\"))\n ) {\n return { name: \"java-gradle\", language: \"java\" };\n }\n\n return { name: \"node\", language: \"node\" };\n}\n\n/**\n * Return the lockfile candidates that exist on disk for `stackName`.\n *\n * Order is deterministic and follows the canonical preference (e.g. for\n * Node: package-lock → pnpm → yarn → bun → package.json). The image\n * builder hashes this list to invalidate the cached layer when any of\n * the files change.\n */\nexport function findLockfiles(projectDir: string, stackName: string): string[] {\n const candidates = STACK_LOCKFILES[stackName] ?? [];\n return candidates.filter((f) => existsSync(join(projectDir, f)));\n}\n","/**\n * GitHub Actions self-hosted runner API client.\n *\n * Wraps four endpoints from GitHub REST API v3 used to manage self-hosted\n * runners on a repository: create-registration-token, list-runners,\n * get-runner, delete-runner.\n *\n * Token safety: the token is never logged, never embedded in error messages,\n * and never printed to stdout/stderr. The internal `buildHeaders` helper is\n * not exported. Errors strip the API base URL and surface only the path +\n * HTTP status — the auth header is never serialized.\n *\n * Uses Node's native `fetch` (Node >= 20). No new dependencies are added.\n * The client is stateless — no caching, no retries — so retry/backoff is the\n * caller's responsibility in later stories.\n */\n\nexport interface GitHubRunner {\n id: number;\n name: string;\n os: string;\n status: string; // \"online\" | \"offline\"\n busy: boolean;\n labels: Array<{ id: number; name: string; type: string }>;\n}\n\nexport interface GitHubRunnerList {\n total_count: number;\n runners: GitHubRunner[];\n}\n\nexport interface GitHubRegistrationToken {\n token: string;\n expires_at: string; // ISO 8601 timestamp\n}\n\nexport interface GitHubRunnerClientConfig {\n owner: string;\n repo: string;\n token: string; // GitHub PAT — never logged\n}\n\nexport class GitHubRunnerApiError extends Error {\n public readonly status: number;\n public readonly endpoint: string;\n\n constructor(status: number, endpoint: string, message: string) {\n super(message);\n this.name = \"GitHubRunnerApiError\";\n this.status = status;\n this.endpoint = endpoint;\n }\n}\n\nconst GITHUB_API_BASE = \"https://api.github.com\";\n\nfunction buildHeaders(token: string): Record<string, string> {\n return {\n Authorization: `token ${token}`,\n Accept: \"application/vnd.github.v3+json\",\n \"User-Agent\": \"beastmode-cli\",\n };\n}\n\nfunction runnersUrl(owner: string, repo: string): string {\n return `${GITHUB_API_BASE}/repos/${owner}/${repo}/actions/runners`;\n}\n\nasync function githubFetch<T>(\n url: string,\n token: string,\n method: string = \"GET\",\n body?: unknown,\n): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: buildHeaders(token),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n const endpoint = url.replace(GITHUB_API_BASE, \"\");\n throw new GitHubRunnerApiError(\n resp.status,\n endpoint,\n `GitHub API ${method} ${endpoint} → ${resp.status}: ${text}`,\n );\n }\n\n if (resp.status === 204) return undefined as T;\n\n return (await resp.json()) as T;\n}\n\nexport async function createRegistrationToken(\n config: GitHubRunnerClientConfig,\n): Promise<GitHubRegistrationToken> {\n const url = `${runnersUrl(config.owner, config.repo)}/registration-token`;\n return githubFetch<GitHubRegistrationToken>(url, config.token, \"POST\");\n}\n\nexport async function listRunners(\n config: GitHubRunnerClientConfig,\n): Promise<GitHubRunnerList> {\n const url = runnersUrl(config.owner, config.repo);\n return githubFetch<GitHubRunnerList>(url, config.token);\n}\n\nexport async function getRunner(\n config: GitHubRunnerClientConfig,\n runnerId: number,\n): Promise<GitHubRunner> {\n const url = `${runnersUrl(config.owner, config.repo)}/${runnerId}`;\n return githubFetch<GitHubRunner>(url, config.token);\n}\n\nexport async function deleteRunner(\n config: GitHubRunnerClientConfig,\n runnerId: number,\n): Promise<void> {\n const url = `${runnersUrl(config.owner, config.repo)}/${runnerId}`;\n await githubFetch<void>(url, config.token, \"DELETE\");\n}\n\n/**\n * Build a GitHubRunnerClientConfig from environment variables.\n * Reads GITHUB_TOKEN (falls back to GH_TOKEN) and PROJECT_REPO (\"owner/repo\").\n * Throws Error with an actionable message when either is missing or invalid.\n */\nexport function resolveGitHubConfig(): GitHubRunnerClientConfig {\n const token = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (!token) {\n throw new Error(\n \"GITHUB_TOKEN (or GH_TOKEN) not set. Add it to .env or export it.\",\n );\n }\n\n const repo = process.env.PROJECT_REPO;\n if (!repo || !repo.includes(\"/\")) {\n throw new Error(\n \"PROJECT_REPO not set or invalid (expected 'owner/repo'). Add it to .env.\",\n );\n }\n\n const [owner, repoName] = repo.split(\"/\", 2);\n return { owner, repo: repoName, token };\n}\n","/**\n * Helpers for `beastmode runner setup` (Story 2 — Docker/Linux path).\n *\n * Lives outside `commands/runner-cmd.ts` so each helper is independently\n * testable without dragging Commander into the test surface.\n *\n * Token safety: the GitHub registration token (RUNNER_TOKEN) flows through\n * `startRunnerContainer` and `writeEnvEntries` but is NEVER passed to the\n * display helpers (info/success/warn/error) or to console.* directly. The\n * docker `run -e RUNNER_TOKEN=...` command line is also never echoed.\n */\n\nimport { execSync, spawn, spawnSync } from \"child_process\";\nimport { promises as fs } from \"fs\";\nimport { join } from \"path\";\nimport {\n GitHubRunnerClientConfig,\n listRunners,\n} from \"./github-runners.js\";\nimport { info } from \"./utils/display.js\";\n\n/**\n * Metadata persisted next to a runner installation so `runner status`\n * (Story 3) and the board's `/api/debug/runner` endpoint can identify\n * mode/platform/service without re-deriving them from process state.\n *\n * Written to:\n * - Native: `~/.beastmode/runners/{name}/runner-meta.json`\n * - Docker: `.beastmode/runner-meta.json`\n */\nexport interface RunnerMeta {\n name: string;\n mode: \"docker\" | \"native\";\n platform: string;\n arch: string;\n installDir?: string;\n service: boolean;\n installedAt: string;\n}\n\n/**\n * Write `runner-meta.json` to the given directory (created if needed).\n * Token-free by design — the schema deliberately excludes\n * RUNNER_TOKEN and any other credentials.\n */\nexport async function writeRunnerMeta(\n dir: string,\n meta: RunnerMeta,\n): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n const path = join(dir, \"runner-meta.json\");\n await fs.writeFile(path, JSON.stringify(meta, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport interface ContainerInfo {\n name: string;\n status: string;\n}\n\nexport interface RunnerStatusResult {\n name: string;\n container: {\n found: boolean;\n status: string | null;\n };\n github: {\n registered: boolean | null;\n id: number | null;\n status: string | null;\n busy: boolean | null;\n os: string | null;\n labels: string[];\n error?: string;\n };\n}\n\n/**\n * Resolve `owner/repo` from the local git remote.\n * Throws when no remote or the URL cannot be parsed.\n */\nexport function resolveRepoSlug(): string {\n let rawUrl: string;\n try {\n rawUrl = execSync(\"git remote get-url origin\", {\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n } catch {\n throw new Error(\n \"Could not determine repo from git remote. Use --repo owner/repo.\",\n );\n }\n const match =\n rawUrl.match(/github\\.com[:/](.+?)(?:\\.git)?$/) ||\n rawUrl.match(/github\\.com\\/(.+?)(?:\\.git)?$/);\n if (!match) {\n throw new Error(\n `Could not parse GitHub repo from remote URL: ${rawUrl}`,\n );\n }\n return match[1];\n}\n\n/**\n * Skip if the image is already cached; otherwise stream `docker pull`.\n * Throws an actionable message when docker is not installed.\n */\nexport async function pullImageIfNeeded(image: string): Promise<void> {\n const inspect = spawnSync(\"docker\", [\"image\", \"inspect\", image], {\n stdio: [\"ignore\", \"ignore\", \"ignore\"],\n });\n if (inspect.error && (inspect.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (inspect.status === 0) return;\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(\"docker\", [\"pull\", image], {\n stdio: [\"ignore\", \"inherit\", \"inherit\"],\n });\n child.on(\"error\", (err) => {\n const e = err as NodeJS.ErrnoException;\n if (e.code === \"ENOENT\") {\n reject(\n new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n ),\n );\n } else {\n reject(err);\n }\n });\n child.on(\"exit\", (code) => {\n if (code === 0) resolve();\n else reject(new Error(`docker pull ${image} exited with code ${code}`));\n });\n });\n}\n\n/**\n * Inspect a container by name. Returns null when the container does not exist.\n */\nexport async function findContainerByName(\n name: string,\n): Promise<ContainerInfo | null> {\n const result = spawnSync(\n \"docker\",\n [\"inspect\", name, \"--format\", \"{{.State.Status}}\"],\n { encoding: \"utf-8\", stdio: [\"ignore\", \"pipe\", \"pipe\"] },\n );\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) return null;\n const status = (result.stdout || \"\").trim();\n if (!status) return null;\n return { name, status };\n}\n\nexport function containerIsHealthy(infoArg: ContainerInfo): boolean {\n return infoArg.status === \"running\";\n}\n\nexport async function removeContainer(name: string): Promise<void> {\n const result = spawnSync(\"docker\", [\"rm\", \"-f\", name], {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) {\n throw new Error(\n `docker rm -f ${name} failed (exit ${result.status}): ${result.stderr || \"\"}`,\n );\n }\n}\n\nexport interface StartRunnerOpts {\n name: string;\n repoUrl: string;\n token: string; // registration token — never logged\n labels: string[];\n /** Override the default `myoung34/github-runner:latest` image. */\n image?: string;\n}\n\n/**\n * Start the runner container in detached mode with required env vars.\n * The full command line is never logged (it would expose the token).\n */\nexport async function startRunnerContainer(\n opts: StartRunnerOpts,\n): Promise<void> {\n const labelStr = opts.labels.join(\",\");\n const image = opts.image ?? \"myoung34/github-runner:latest\";\n const args = [\n \"run\",\n \"-d\",\n \"--restart=unless-stopped\",\n \"--name\",\n opts.name,\n \"-e\",\n `REPO_URL=${opts.repoUrl}`,\n \"-e\",\n `RUNNER_TOKEN=${opts.token}`,\n \"-e\",\n `LABELS=${labelStr}`,\n \"-e\",\n `RUNNER_NAME=${opts.name}`,\n \"-v\",\n \"/var/run/docker.sock:/var/run/docker.sock\",\n image,\n ];\n\n const result = spawnSync(\"docker\", args, {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (result.error && (result.error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(\n \"Docker is required for the default runner. Install Docker, or use --native.\",\n );\n }\n if (result.status !== 0) {\n // Sanitize stderr — strip the token if docker echoed it back.\n const stderr = (result.stderr || \"\").replace(opts.token, \"<REDACTED>\");\n throw new Error(\n `docker run failed (exit ${result.status}): ${stderr}`,\n );\n }\n}\n\n/**\n * Remove `.env` lines whose key matches any of `keys`. No-op if `.env` does\n * not exist. Never reads or logs the values being removed (notably\n * RUNNER_TOKEN). Inverse of `writeEnvEntries`.\n */\nexport async function removeEnvEntries(\n keys: string[],\n envPath: string = \".env\",\n): Promise<void> {\n let existing = \"\";\n try {\n existing = await fs.readFile(envPath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n return;\n }\n const lines = existing.split(\"\\n\");\n const filtered = lines.filter(\n (line) => !keys.some((key) => line.startsWith(`${key}=`)),\n );\n await fs.writeFile(envPath, filtered.join(\"\\n\"), \"utf-8\");\n}\n\n/**\n * Read `.env`, replace existing keys, append missing ones, write back.\n * The values (notably RUNNER_TOKEN) are never logged.\n */\nexport async function writeEnvEntries(\n entries: Record<string, string>,\n envPath: string = \".env\",\n): Promise<void> {\n let existing = \"\";\n try {\n existing = await fs.readFile(envPath, \"utf-8\");\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"ENOENT\") throw err;\n }\n\n const lines = existing === \"\" ? [] : existing.split(\"\\n\");\n const remainingKeys = new Set(Object.keys(entries));\n\n const updated = lines.map((line) => {\n for (const key of remainingKeys) {\n if (line.startsWith(`${key}=`)) {\n remainingKeys.delete(key);\n return `${key}=${entries[key]}`;\n }\n }\n return line;\n });\n\n for (const key of remainingKeys) {\n updated.push(`${key}=${entries[key]}`);\n }\n\n let output = updated.join(\"\\n\");\n if (existing !== \"\" && !existing.endsWith(\"\\n\") && !output.endsWith(\"\\n\")) {\n output += \"\\n\";\n } else if (existing === \"\" && !output.endsWith(\"\\n\")) {\n output += \"\\n\";\n }\n\n await fs.writeFile(envPath, output, \"utf-8\");\n}\n\nconst sleep = (ms: number) => new Promise<void>((r) => setTimeout(r, ms));\n\n/**\n * Poll `listRunners` every 3s up to `timeoutMs` waiting for the named\n * runner to report status === \"online\". Throws on timeout with a hint.\n */\nexport async function pollUntilOnline(\n config: GitHubRunnerClientConfig,\n name: string,\n timeoutMs: number,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n try {\n const list = await listRunners(config);\n const runner = list.runners.find((r) => r.name === name);\n if (runner && runner.status === \"online\") return;\n } catch {\n // transient API errors are tolerated within the timeout window\n }\n if (Date.now() + 3000 >= deadline) break;\n await sleep(3000);\n }\n throw new Error(\n `Runner '${name}' did not appear online within ${Math.floor(\n timeoutMs / 1000,\n )}s — check container logs with: docker logs ${name}`,\n );\n}\n\n/** Tiny step helper — display.ts's `step` takes (n, total, text) which doesn't\n * fit our linear setup flow. We just use info() for narration. */\nexport function setupStep(text: string): void {\n info(text);\n}\n","/**\n * Native runner setup (Story 5).\n *\n * Implements the `--native` and `--native --service` paths for\n * `beastmode runner setup`. The native path downloads the official\n * `actions/runner` binary, configures it against the user's repo, and\n * starts it either in the foreground (default) or as a background\n * service (`--service`): systemd user-service on Linux, launchd user-\n * agent on macOS.\n *\n * Token safety: the GitHub registration token is never logged. The\n * config.sh stderr is sanitized before being included in error\n * messages — see `configureRunner`.\n */\n\nimport {\n execSync,\n spawn,\n spawnSync,\n} from \"child_process\";\nimport {\n createWriteStream,\n existsSync,\n mkdirSync,\n unlinkSync,\n writeFileSync,\n} from \"fs\";\nimport { homedir } from \"os\";\nimport { join, dirname } from \"path\";\nimport { Readable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\n\nimport {\n createRegistrationToken,\n resolveGitHubConfig,\n} from \"./github-runners.js\";\nimport {\n pollUntilOnline,\n resolveRepoSlug,\n setupStep,\n writeEnvEntries,\n writeRunnerMeta,\n} from \"./runner-helpers.js\";\nimport { header, info, success, warn } from \"./utils/display.js\";\n\n/**\n * Pinned GitHub Actions runner version. Bump manually when a new\n * release is available; the URL pattern is stable across releases.\n */\nexport const RUNNER_VERSION = \"2.322.0\";\n\nexport type RunnerOS = \"linux\" | \"darwin\";\nexport type RunnerArch = \"x64\" | \"arm64\";\n\nexport interface DetectedPlatform {\n os: RunnerOS;\n arch: RunnerArch;\n}\n\n/**\n * Detect the host platform and CPU architecture. Throws with a\n * user-actionable message on Windows or unsupported arches.\n */\nexport function detectPlatform(): DetectedPlatform {\n const platform = process.platform;\n if (platform === \"win32\") {\n throw new Error(\n \"--native is not supported on Windows. Use Docker or WSL.\",\n );\n }\n if (platform !== \"linux\" && platform !== \"darwin\") {\n throw new Error(\n `--native is not supported on ${platform}. Use Docker instead.`,\n );\n }\n\n const arch = process.arch;\n if (arch !== \"x64\" && arch !== \"arm64\") {\n throw new Error(\n `Unsupported architecture: ${arch}. GitHub runners support x64 and arm64.`,\n );\n }\n\n return { os: platform as RunnerOS, arch: arch as RunnerArch };\n}\n\n/**\n * Build the GitHub release download URL. Note: GitHub uses \"osx\", not\n * \"darwin\", in the asset filename — the platform translation is\n * encoded here so callers can pass our internal name.\n */\nexport function runnerDownloadUrl(os: RunnerOS, arch: RunnerArch): string {\n const ghOs = os === \"darwin\" ? \"osx\" : \"linux\";\n return (\n `https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}` +\n `/actions-runner-${ghOs}-${arch}-${RUNNER_VERSION}.tar.gz`\n );\n}\n\n/**\n * Download and extract the runner tarball into `installDir`. On macOS,\n * removes the Gatekeeper quarantine attribute (`xattr -c -r`). Skips\n * the download entirely when `installDir/run.sh` already exists, to\n * satisfy NFR-2 (idempotency).\n */\nexport async function downloadAndExtractRunner(\n installDir: string,\n os: RunnerOS,\n arch: RunnerArch,\n): Promise<void> {\n const runShPath = join(installDir, \"run.sh\");\n if (existsSync(runShPath)) {\n info(\n `Runner binary already present at ${runShPath} — skipping download.`,\n );\n if (os === \"darwin\") {\n // Re-run quarantine removal to be safe on a partially-extracted dir.\n spawnSync(\"xattr\", [\"-c\", \"-r\", installDir], { stdio: \"ignore\" });\n }\n return;\n }\n\n const url = runnerDownloadUrl(os, arch);\n const tarball = join(installDir, \"runner.tar.gz\");\n\n setupStep(\n `Downloading GitHub Actions runner v${RUNNER_VERSION} (${os}/${arch})...`,\n );\n const resp = await fetch(url);\n if (!resp.ok || !resp.body) {\n throw new Error(\n `Failed to download runner: HTTP ${resp.status} from ${url}`,\n );\n }\n await pipeline(\n Readable.fromWeb(resp.body as any),\n createWriteStream(tarball),\n );\n\n setupStep(\"Extracting runner...\");\n try {\n execSync(\"tar -xzf runner.tar.gz\", { cwd: installDir, stdio: \"ignore\" });\n } catch (err: any) {\n throw new Error(\n `Failed to extract runner archive: ${err?.message ?? String(err)}`,\n );\n }\n\n try {\n unlinkSync(tarball);\n } catch {\n // Tarball cleanup is best-effort; the runner is already extracted.\n }\n\n if (os === \"darwin\") {\n setupStep(\"Removing macOS Gatekeeper quarantine attribute...\");\n warn(\n \"macOS Gatekeeper quarantine: running xattr -c -r on runner binaries.\",\n );\n warn(\n \"This is required because macOS quarantines downloaded executables.\",\n );\n spawnSync(\"xattr\", [\"-c\", \"-r\", installDir], { stdio: \"ignore\" });\n }\n}\n\n/**\n * Run `config.sh` with `--unattended --replace`. The token is passed\n * via argv to config.sh but never logged. On failure the token is\n * stripped from the captured stderr before raising.\n */\nexport async function configureRunner(\n installDir: string,\n repoUrl: string,\n token: string,\n name: string,\n labels: string[],\n): Promise<void> {\n setupStep(\"Configuring runner...\");\n const args = [\n \"--url\",\n repoUrl,\n \"--token\",\n token,\n \"--name\",\n name,\n \"--labels\",\n labels.join(\",\"),\n \"--unattended\",\n \"--replace\",\n ];\n const result = spawnSync(join(installDir, \"config.sh\"), args, {\n cwd: installDir,\n stdio: [\"ignore\", \"inherit\", \"pipe\"],\n encoding: \"utf-8\",\n });\n if (\n result.error &&\n (result.error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n throw new Error(\n `Runner configuration failed: config.sh not found at ${installDir}/config.sh.`,\n );\n }\n if (result.status !== 0) {\n const stderr = (result.stderr || \"\").replace(token, \"<REDACTED>\");\n throw new Error(\n `Runner configuration failed (exit ${result.status}): ${stderr}`,\n );\n }\n}\n\n/**\n * Spawn `run.sh` in the foreground. The spawn is fire-and-forget — the\n * runner stays attached to this terminal and exits when the user hits\n * Ctrl+C or the terminal closes. On macOS we warn that the agent dies\n * with the terminal and recommend `--service`.\n */\nexport function startRunnerForeground(installDir: string): void {\n setupStep(\"Starting runner in foreground mode (Ctrl+C to stop)...\");\n info(\"The runner will stop when this terminal closes.\");\n if (process.platform === \"darwin\") {\n warn(\n \"macOS pitfall: if the terminal session disconnects, the runner dies.\",\n );\n warn(\n \"Use --service to install as a launchd agent for persistent operation.\",\n );\n }\n spawn(join(installDir, \"run.sh\"), [], {\n cwd: installDir,\n stdio: \"inherit\",\n });\n}\n\n/**\n * Render the systemd user unit file. Restart=on-failure auto-recovers\n * a crashed runner; a clean exit (e.g. `runner remove`) does not\n * trigger restart.\n */\nexport function systemdUnitContent(installDir: string, name: string): string {\n return `[Unit]\nDescription=GitHub Actions Runner (${name})\nAfter=network.target\n\n[Service]\nType=simple\nWorkingDirectory=${installDir}\nExecStart=${installDir}/run.sh\nRestart=on-failure\nRestartSec=5\nKillSignal=SIGTERM\nTimeoutStopSec=30\n\n[Install]\nWantedBy=default.target\n`;\n}\n\n/**\n * Install and start a systemd user service for the runner.\n * Lives in `~/.config/systemd/user/beastmode-runner-{name}.service`.\n */\nexport async function installSystemdService(\n installDir: string,\n name: string,\n): Promise<void> {\n const unitName = `beastmode-runner-${name}.service`;\n const unitDir = join(homedir(), \".config\", \"systemd\", \"user\");\n mkdirSync(unitDir, { recursive: true });\n writeFileSync(\n join(unitDir, unitName),\n systemdUnitContent(installDir, name),\n \"utf-8\",\n );\n\n try {\n execSync(\"systemctl --user daemon-reload\", { stdio: \"inherit\" });\n execSync(`systemctl --user enable --now ${unitName}`, {\n stdio: \"inherit\",\n });\n } catch (err: any) {\n throw new Error(\n `systemd user-service install failed: ${err?.message ?? String(err)}. ` +\n `Ensure systemd --user is available (some minimal Linux containers don't ship it).`,\n );\n }\n\n success(`Installed and started systemd user service: ${unitName}`);\n info(` Check status: systemctl --user status ${unitName}`);\n info(` View logs: journalctl --user -u ${unitName} -f`);\n}\n\n/**\n * Render the launchd plist for a user agent. Explicit PATH covers\n * `/opt/homebrew/bin` for Apple Silicon Homebrew. RunAtLoad=true and\n * KeepAlive on unsuccessful exit mean the runner restarts after a\n * crash but not after a clean shutdown.\n */\nexport function launchdPlistContent(installDir: string, name: string): string {\n const label = `com.beastmode.runner.${name}`;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${label}</string>\n <key>WorkingDirectory</key>\n <string>${installDir}</string>\n <key>ProgramArguments</key>\n <array>\n <string>${installDir}/run.sh</string>\n </array>\n <key>RunAtLoad</key>\n <true/>\n <key>KeepAlive</key>\n <dict>\n <key>SuccessfulExit</key>\n <false/>\n </dict>\n <key>StandardOutPath</key>\n <string>${installDir}/logs/stdout.log</string>\n <key>StandardErrorPath</key>\n <string>${installDir}/logs/stderr.log</string>\n <key>EnvironmentVariables</key>\n <dict>\n <key>PATH</key>\n <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin</string>\n </dict>\n</dict>\n</plist>\n`;\n}\n\n/**\n * Install and load a launchd user agent for the runner. Plist lives\n * at `~/Library/LaunchAgents/com.beastmode.runner.{name}.plist`.\n */\nexport async function installLaunchdService(\n installDir: string,\n name: string,\n): Promise<void> {\n const label = `com.beastmode.runner.${name}`;\n const plistPath = join(\n homedir(),\n \"Library\",\n \"LaunchAgents\",\n `${label}.plist`,\n );\n mkdirSync(dirname(plistPath), { recursive: true });\n mkdirSync(join(installDir, \"logs\"), { recursive: true });\n writeFileSync(plistPath, launchdPlistContent(installDir, name), \"utf-8\");\n\n try {\n execSync(`launchctl load ${plistPath}`, { stdio: \"inherit\" });\n } catch (err: any) {\n throw new Error(\n `launchd agent install failed: ${err?.message ?? String(err)}.`,\n );\n }\n\n success(`Installed and loaded launchd agent: ${label}`);\n info(` Check status: launchctl list | grep ${label}`);\n info(` View logs: tail -f ${installDir}/logs/stdout.log`);\n\n warn(\"macOS pitfall: launchd agents only run while the user is logged in.\");\n warn(\n \"If you reboot without auto-login, the runner won't start until you log in.\",\n );\n warn(\"For headless servers, use a LaunchDaemon (requires root) instead.\");\n}\n\n/**\n * Dispatch to the right service installer for the host OS.\n */\nexport async function installRunnerService(\n installDir: string,\n name: string,\n os: RunnerOS,\n): Promise<void> {\n if (os === \"linux\") {\n await installSystemdService(installDir, name);\n } else {\n await installLaunchdService(installDir, name);\n }\n}\n\nexport interface NativeRunnerSetupOpts {\n repo?: string;\n name: string;\n label: string;\n native?: boolean;\n service?: boolean;\n dryRun?: boolean;\n}\n\n/**\n * Top-level orchestrator for `beastmode runner setup --native`.\n *\n * Flow:\n * detect platform → token → download → configure → write env →\n * write metadata → start (foreground or service) → poll online.\n */\nexport async function nativeRunnerSetup(\n opts: NativeRunnerSetupOpts,\n): Promise<void> {\n if (opts.service !== undefined && !opts.native) {\n throw new Error(\n \"--service requires --native. The Docker runner always runs as a container service.\",\n );\n }\n\n const { os: platformOs, arch } = detectPlatform();\n\n if (platformOs === \"darwin\") {\n header(\"Native Runner Setup (macOS)\");\n warn(\n \"macOS has several pitfalls for self-hosted runners. Read the warnings below carefully.\",\n );\n } else {\n header(\"Native Runner Setup (Linux)\");\n }\n\n const ghConfig = resolveGitHubConfig();\n const repoSlug = opts.repo ?? resolveRepoSlug();\n\n const installDir = join(homedir(), \".beastmode\", \"runners\", opts.name);\n\n if (opts.dryRun) {\n info(\n `[dry-run] Would install native runner '${opts.name}' for repo ${repoSlug}`,\n );\n info(`[dry-run] Platform: ${platformOs}/${arch}`);\n info(`[dry-run] Install dir: ${installDir}`);\n info(`[dry-run] Mode: ${opts.service ? \"service\" : \"foreground\"}`);\n return;\n }\n\n mkdirSync(installDir, { recursive: true });\n\n setupStep(\"Generating registration token via GitHub API...\");\n const { token: regToken } = await createRegistrationToken(ghConfig);\n\n await downloadAndExtractRunner(installDir, platformOs, arch);\n\n const repoUrl = `https://github.com/${ghConfig.owner}/${ghConfig.repo}`;\n await configureRunner(installDir, repoUrl, regToken, opts.name, [\n \"self-hosted\",\n opts.label,\n ]);\n\n await writeEnvEntries({\n RUNNER_REPO_URL: repoUrl,\n RUNNER_TOKEN: regToken,\n RUNNER_NAME: opts.name,\n RUNNER_MODE: \"native\",\n });\n\n await writeRunnerMeta(installDir, {\n name: opts.name,\n mode: \"native\",\n platform: platformOs,\n arch,\n installDir,\n service: opts.service ?? false,\n installedAt: new Date().toISOString(),\n });\n\n if (opts.service) {\n await installRunnerService(installDir, opts.name, platformOs);\n } else {\n startRunnerForeground(installDir);\n }\n\n setupStep(\"Waiting for runner to appear online on GitHub (timeout 60s)...\");\n await pollUntilOnline(ghConfig, opts.name, 60_000);\n success(\n `Runner '${opts.name}' registered and online (native/${platformOs}).`,\n );\n}\n","/**\n * Workflow runs-on switcher for the self-hosted runner workflow.\n *\n * `switchWorkflows()` rewrites every job's `runs-on:` line in the target\n * workflow files to `[self-hosted, beastmode]` and persists the original\n * lines to `.beastmode/runner-workflow-state.json`. `restoreWorkflows()`\n * reads that state and puts the originals back, then deletes the state\n * file. Round-tripping (switch → restore) produces a byte-identical\n * file because the originals are stored as full line text including\n * indentation.\n *\n * Editing is line-by-line with a regex rather than YAML parse/serialize\n * so comments and whitespace survive untouched.\n */\n\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n unlinkSync,\n writeFileSync,\n} from \"fs\";\nimport { dirname, join } from \"path\";\n\nexport const TARGET_LABEL = \"[self-hosted, beastmode]\";\n\nexport const TARGET_WORKFLOWS = [\n \".github/workflows/test.yml\",\n \".github/workflows/dogfood-e2e.yml\",\n];\n\nexport const STATE_FILE = \".beastmode/runner-workflow-state.json\";\n\nexport const RUNS_ON_REGEX = /^(\\s+runs-on:\\s*)(.+)$/;\n\nexport interface WorkflowOriginal {\n line: string;\n}\n\nexport interface WorkflowFileState {\n relativePath: string;\n originals: WorkflowOriginal[];\n}\n\nexport interface WorkflowSwitchState {\n switched_at: string;\n target_label: string;\n files: WorkflowFileState[];\n}\n\nexport interface FileResult {\n relativePath: string;\n jobCount: number;\n}\n\nexport interface SwitchResult {\n alreadySwitched: boolean;\n files: FileResult[];\n}\n\nexport interface RestoreResult {\n nothingToRestore: boolean;\n files: FileResult[];\n}\n\nexport function replaceRunsOn(\n content: string,\n targetLabel: string,\n): { newContent: string; originals: WorkflowOriginal[] } {\n const lines = content.split(\"\\n\");\n const originals: WorkflowOriginal[] = [];\n\n const newLines = lines.map((line) => {\n const match = line.match(RUNS_ON_REGEX);\n if (match) {\n originals.push({ line });\n return `${match[1]}${targetLabel}`;\n }\n return line;\n });\n\n return {\n newContent: newLines.join(\"\\n\"),\n originals,\n };\n}\n\nexport function restoreRunsOn(\n content: string,\n originals: WorkflowOriginal[],\n): string {\n const lines = content.split(\"\\n\");\n let idx = 0;\n\n const newLines = lines.map((line) => {\n const match = line.match(RUNS_ON_REGEX);\n if (match && idx < originals.length) {\n const restored = originals[idx].line;\n idx++;\n return restored;\n }\n return line;\n });\n\n return newLines.join(\"\\n\");\n}\n\nexport async function switchWorkflows(\n projectDir: string,\n): Promise<SwitchResult> {\n const statePath = join(projectDir, STATE_FILE);\n\n if (existsSync(statePath)) {\n return { alreadySwitched: true, files: [] };\n }\n\n const state: WorkflowSwitchState = {\n switched_at: new Date().toISOString(),\n target_label: TARGET_LABEL,\n files: [],\n };\n\n const resultFiles: FileResult[] = [];\n\n for (const relPath of TARGET_WORKFLOWS) {\n const absPath = join(projectDir, relPath);\n if (!existsSync(absPath)) {\n throw new Error(`Workflow file not found: ${relPath}`);\n }\n\n const content = readFileSync(absPath, \"utf-8\");\n const { newContent, originals } = replaceRunsOn(content, TARGET_LABEL);\n\n if (originals.length === 0) {\n throw new Error(`No runs-on found in ${relPath}`);\n }\n\n writeFileSync(absPath, newContent, \"utf-8\");\n\n state.files.push({ relativePath: relPath, originals });\n resultFiles.push({ relativePath: relPath, jobCount: originals.length });\n }\n\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, JSON.stringify(state, null, 2) + \"\\n\", \"utf-8\");\n\n return { alreadySwitched: false, files: resultFiles };\n}\n\nexport async function restoreWorkflows(\n projectDir: string,\n): Promise<RestoreResult> {\n const statePath = join(projectDir, STATE_FILE);\n\n if (!existsSync(statePath)) {\n return { nothingToRestore: true, files: [] };\n }\n\n const state: WorkflowSwitchState = JSON.parse(\n readFileSync(statePath, \"utf-8\"),\n );\n const resultFiles: FileResult[] = [];\n\n for (const fileState of state.files) {\n const absPath = join(projectDir, fileState.relativePath);\n if (!existsSync(absPath)) {\n throw new Error(`Workflow file not found: ${fileState.relativePath}`);\n }\n\n const content = readFileSync(absPath, \"utf-8\");\n const newContent = restoreRunsOn(content, fileState.originals);\n\n writeFileSync(absPath, newContent, \"utf-8\");\n resultFiles.push({\n relativePath: fileState.relativePath,\n jobCount: fileState.originals.length,\n });\n }\n\n unlinkSync(statePath);\n\n return { nothingToRestore: false, files: resultFiles };\n}\n","import { Command } from \"commander\";\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, renameSync, statSync } from \"fs\";\nimport { join, resolve, basename } from \"path\";\nimport { execSync } from \"child_process\";\nimport { detectStack } from \"../../engine/index.js\";\n\nconst DEFAULT_MAX_PROJECTS = 5;\nconst MIN_DISK_WARNING_GB = 10;\n\nfunction countExistingProjects(factoryDir: string): number {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return 0;\n let count = 0;\n for (const entry of readdirSync(projectsDir)) {\n if (entry.startsWith(\".\")) continue;\n if (existsSync(join(projectsDir, entry, \"project.json\"))) count++;\n else if (entry.endsWith(\".json\")) count++;\n }\n return count;\n}\n\nfunction getMaxProjects(factoryDir: string): number {\n const configPath = join(factoryDir, \".beastmode\", \"config.json\");\n if (existsSync(configPath)) {\n try {\n const config = JSON.parse(readFileSync(configPath, \"utf-8\"));\n if (typeof config.max_projects === \"number\") return config.max_projects;\n } catch { /* ignore */ }\n }\n return DEFAULT_MAX_PROJECTS;\n}\n\nfunction getFreeDiskGB(): number | null {\n try {\n // Works on both macOS and Linux\n const output = execSync(\"df -k / | tail -1\", { encoding: \"utf-8\", timeout: 3000 });\n const parts = output.trim().split(/\\s+/);\n const availKB = parseInt(parts[3], 10); // Available in KB\n if (!isNaN(availKB)) return Math.floor(availKB / (1024 * 1024));\n } catch { /* ignore */ }\n return null;\n}\n\nexport function projectAddAction(\n factoryDir: string,\n projectPath: string,\n opts: { name?: string; boardId?: string },\n): void {\n const resolvedPath = resolve(projectPath);\n if (!existsSync(resolvedPath)) throw new Error(`Directory not found: ${resolvedPath}`);\n\n const projectName = opts.name || basename(resolvedPath);\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\", projectName);\n\n if (existsSync(projectsDir)) throw new Error(`Project already exists: ${projectName}`);\n\n // Check project limit\n const currentCount = countExistingProjects(factoryDir);\n const maxProjects = getMaxProjects(factoryDir);\n if (currentCount >= maxProjects) {\n throw new Error(\n `Factory has ${currentCount}/${maxProjects} projects. ` +\n `Increase \"max_projects\" in .beastmode/config.json or remove a project with \"beastmode project remove <name>\".`\n );\n }\n\n // Warn about disk space\n const freeGB = getFreeDiskGB();\n if (freeGB !== null && freeGB < MIN_DISK_WARNING_GB) {\n console.warn(\n `Warning: only ${freeGB}GB free disk space. Each project with worktrees may use 1-2GB. Consider freeing space.`\n );\n }\n\n mkdirSync(projectsDir, { recursive: true });\n\n // Detect stack\n let stack: Record<string, unknown> = {};\n try {\n stack = detectStack(resolvedPath) as unknown as Record<string, unknown>;\n } catch { /* ignore */ }\n\n // Assign verify port (scan existing for highest)\n let verifyPort = 3001;\n const allProjectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (existsSync(allProjectsDir)) {\n for (const d of readdirSync(allProjectsDir)) {\n if (d.startsWith(\".\")) continue;\n // Skip the newly created project dir (it has no project.json yet)\n if (d === projectName) continue;\n const pf = join(allProjectsDir, d, \"project.json\");\n if (existsSync(pf)) {\n try {\n const pc = JSON.parse(readFileSync(pf, \"utf-8\"));\n const port = pc?.deploy?.verify_port;\n if (typeof port === \"number\" && port >= verifyPort) verifyPort = port + 1;\n } catch { /* skip */ }\n }\n }\n }\n\n const projectConfig = {\n name: projectName,\n path: resolvedPath,\n github: {\n repo: (stack as Record<string, unknown>).git_remote || \"\",\n default_branch: \"main\",\n },\n board: {\n id: opts.boardId ? parseInt(opts.boardId, 10) : null,\n url: \"http://127.0.0.1:8080\",\n auto_created: !opts.boardId,\n },\n deploy: { verify_port: verifyPort },\n pipeline: {},\n models: {},\n slots: { max: null },\n registered_at: new Date().toISOString(),\n };\n\n writeFileSync(join(projectsDir, \"project.json\"), JSON.stringify(projectConfig, null, 2) + \"\\n\");\n writeFileSync(join(projectsDir, \"extensions.json\"), JSON.stringify({\n plugins: { add: [], remove: [] },\n mcps: { add: {}, remove: [] },\n skills: { add: [], remove: [] },\n }, null, 2) + \"\\n\");\n\n // Create runs subdirectory\n const runsDir = join(factoryDir, \"runs\", projectName);\n if (!existsSync(runsDir)) mkdirSync(runsDir, { recursive: true });\n\n // After writing extensions.json, try to create the board\n if (!opts.boardId) {\n void (async () => {\n try {\n const boardUrl = projectConfig.board.url;\n const http = await import(\"http\");\n const postData = JSON.stringify({ project_name: projectName });\n await new Promise<void>((resolve, reject) => {\n const url = new URL(\"/api/boards\", boardUrl);\n const req = http.request(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Content-Length\": Buffer.byteLength(postData).toString(),\n },\n }, (res) => {\n let data = \"\";\n res.on(\"data\", (chunk: Buffer) => { data += chunk.toString(); });\n res.on(\"end\", () => {\n try {\n const result = JSON.parse(data);\n if (result.created) {\n // Update project.json with the board info\n projectConfig.board.auto_created = true;\n }\n } catch { /* ignore parse errors */ }\n resolve();\n });\n });\n req.on(\"error\", () => resolve()); // Board may not be running — non-fatal\n req.end(postData);\n });\n } catch {\n // Board creation is best-effort — it'll be created on first access anyway\n }\n })();\n }\n}\n\nexport function projectListAction(factoryDir: string): Array<Record<string, unknown>> {\n const projectsDir = join(factoryDir, \".beastmode\", \"projects\");\n if (!existsSync(projectsDir)) return [];\n return readdirSync(projectsDir)\n .filter((d) => !d.startsWith(\".\") && existsSync(join(projectsDir, d, \"project.json\")))\n .map((d) => {\n try { return JSON.parse(readFileSync(join(projectsDir, d, \"project.json\"), \"utf-8\")); }\n catch { return null; }\n })\n .filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nexport function projectRemoveAction(factoryDir: string, name: string): void {\n const projectDir = join(factoryDir, \".beastmode\", \"projects\", name);\n if (!existsSync(projectDir)) throw new Error(`Project not found: ${name}`);\n const archiveDir = join(factoryDir, \".beastmode\", \"projects\", \".archived\", name);\n mkdirSync(join(factoryDir, \".beastmode\", \"projects\", \".archived\"), { recursive: true });\n renameSync(projectDir, archiveDir);\n}\n\nexport const projectCommand = new Command(\"project\")\n .description(\"Manage projects in this factory\");\n\nprojectCommand\n .command(\"add <path>\")\n .description(\"Register a project\")\n .option(\"--name <name>\", \"Override project name\")\n .option(\"--board-id <id>\", \"Link to existing board ID\")\n .action((path, opts) => {\n const factoryDir = resolve(\".\");\n projectAddAction(factoryDir, path, opts);\n console.log(`Project registered: ${opts.name || basename(resolve(path))}`);\n });\n\nprojectCommand\n .command(\"list\")\n .description(\"List registered projects\")\n .action(() => {\n const projects = projectListAction(resolve(\".\"));\n if (projects.length === 0) { console.log(\"No projects registered.\"); return; }\n for (const p of projects) { console.log(` ${p.name} — ${p.path}`); }\n });\n\nprojectCommand\n .command(\"remove <name>\")\n .description(\"Archive a project\")\n .action((name) => {\n projectRemoveAction(resolve(\".\"), name);\n console.log(`Project archived: ${name}`);\n });\n"],"mappings":"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","names":["existsSync","readFileSync","join","semver","readFileSync","existsSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","join","readFileSync","writeFileSync","existsSync","mkdirSync","dirname","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","resolve","existsSync","cpSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","pipeline","mkdirSync","writeFileSync","existsSync","dirname","resolve","existsSync","writeFileSync","existsSync","mkdirSync","readdirSync","readFileSync","statSync","writeFileSync","join","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","unlinkSync","join","dirname","http","resolve","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","statSync","join","getProductDir","execSync","readFileSync","writeFileSync","existsSync","mkdirSync","readdirSync","statSync","join","resolve","methodology","buildArtifactIndex","spawn","readFileSync","writeFileSync","existsSync","readdirSync","unlinkSync","mkdirSync","statSync","rmSync","join","basename","resolve","dirname","execSync","http","getBoardUrl","deepMerge","poll","seen","allItems","listProducts","loadInception","loadArtifact","listMethodologies","createInceptionState","createEpicsOnBoard","migrateInceptionToSession","listStrategySessions","loadStrategySession","createStrategySession","buildArtifactIndex","loadSessionArtifact","readFileSync","existsSync","join","dirname","fileURLToPath","WebSocketServer","resolve","getBoardUrl","resolve","join","existsSync","readFileSync","mkdirSync","writeFileSync","readdirSync","execSync","url","cmd","out","factoryJsonPath","startServer","Command","execSync","spawnSync","writeFileSync","readFileSync","mkdirSync","existsSync","unlinkSync","join","homedir","result","z","readFileSync","writeFileSync","existsSync","readdirSync","mkdirSync","join","resolve","basename","randomUUID","readJsonFile","init_server","init_server","Command","Command","resolve","basename","join","existsSync","writeFileSync","mkdirSync","readFileSync","existsSync","join","join","Command","readFileSync","resolve","existsSync","startServer","factoryName","basename","projectPath","parseTemplate","actions","syncClaudeCredsOnce","installAgent","syncClaudeCredsLinux","installAgentLinux","join","mkdirSync","writeFileSync","Command","readFileSync","writeFileSync","existsSync","readdirSync","resolve","join","Command","resolve","Command","resolve","Command","resolve","Command","resolve","readFileSync","existsSync","join","Command","readFileSync","writeFileSync","mkdirSync","existsSync","resolve","join","Command","existsSync","readFileSync","readdirSync","execSync","join","resolve","Command","existsSync","readFileSync","writeFileSync","join","resolve","execSync","readConfig","writeConfig","Command","existsSync","readFileSync","readdirSync","join","resolve","execSync","spawnSync","homedir","platform","http","execSync","resolve","http","platform","join","homedir","existsSync","readFileSync","info","join","existsSync","readdirSync","readFileSync","LAUNCH_AGENT_LABEL","homedir","platform","spawnSync","data","Command","resolve","Command","existsSync","readFileSync","writeFileSync","join","resolve","existsSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","writeFileSync","join","existsSync","readFileSync","readConfig","writeFileSync","Command","resolve","result","Command","resolve","join","existsSync","readFileSync","mkdirSync","writeFileSync","readdirSync","execSync","Command","join","existsSync","readFileSync","writeFileSync","mkdirSync","randomUUID","readdirSync","execSync","spawn","Command","join","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","execSync","spawn","unlinkSync","Command","startMcpServer","Command","resolve","join","existsSync","writeFileSync","readFileSync","execSync","fileURLToPath","dirname","stackName","__filename","__dirname","Command","spawnSync","LAUNCH_AGENT_LABEL","SYSTEMD_CREDS_TIMER","spawnSync","syncClaudeCredsOnce","installAgent","syncClaudeCredsLinux","installAgentLinux","Command","Command","inquirer","inquirer","Command","Command","Command","Command","readFileSync","writeFileSync","readFileSync","writeFileSync","Command","Command","spawn","existsSync","readdirSync","readFileSync","basename","join","resolve","execSync","existsSync","mkdirSync","readFileSync","writeFileSync","join","existsSync","readFileSync","join","readFileSafe","parseJsonSafe","join","existsSync","readFileSync","mkdirSync","writeFileSync","execSync","execSync","spawnSync","join","join","execSync","spawnSync","resolve","execSync","spawn","spawnSync","existsSync","mkdirSync","unlinkSync","writeFileSync","homedir","join","dirname","platform","join","existsSync","spawnSync","execSync","unlinkSync","spawn","homedir","mkdirSync","writeFileSync","plistPath","dirname","existsSync","mkdirSync","readFileSync","unlinkSync","writeFileSync","dirname","join","Command","join","existsSync","readdirSync","readFileSync","resolve","basename","spawn","Command","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","renameSync","join","resolve","basename","execSync","http","Command"]}
|