opencode-sdlc-plugin 0.2.1 → 0.3.2
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/LICENSE +18 -0
- package/README.md +127 -38
- package/commands/sdlc-adr.md +245 -17
- package/commands/sdlc-debug.md +376 -0
- package/commands/sdlc-design.md +205 -47
- package/commands/sdlc-dev.md +544 -0
- package/commands/sdlc-info.md +325 -0
- package/commands/sdlc-parallel.md +283 -0
- package/commands/sdlc-recall.md +203 -8
- package/commands/sdlc-remember.md +126 -9
- package/commands/sdlc-research.md +343 -0
- package/commands/sdlc-review.md +201 -128
- package/commands/sdlc-status.md +297 -0
- package/config/presets/copilot-only.json +69 -0
- package/config/presets/enterprise.json +79 -0
- package/config/presets/event-modeling.json +74 -8
- package/config/presets/minimal.json +70 -0
- package/config/presets/solo-quick.json +70 -0
- package/config/presets/standard.json +78 -0
- package/config/presets/strict-tdd.json +79 -0
- package/config/schemas/athena.schema.json +338 -0
- package/config/schemas/sdlc.schema.json +442 -26
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.js +4285 -562
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +1781 -1
- package/dist/index.js +7759 -395
- package/dist/index.js.map +1 -1
- package/dist/plugin/index.d.ts +17 -2
- package/dist/plugin/index.js +7730 -397
- package/dist/plugin/index.js.map +1 -1
- package/package.json +68 -33
- package/prompts/agents/code-reviewer.md +229 -0
- package/prompts/agents/domain.md +210 -0
- package/prompts/agents/green.md +148 -0
- package/prompts/agents/mutation.md +278 -0
- package/prompts/agents/red.md +112 -0
- package/prompts/event-modeling/discovery.md +176 -0
- package/prompts/event-modeling/gwt-generation.md +479 -0
- package/prompts/event-modeling/workflow-design.md +318 -0
- package/prompts/personas/amelia-developer.md +43 -0
- package/prompts/personas/bob-sm.md +43 -0
- package/prompts/personas/john-pm.md +43 -0
- package/prompts/personas/mary-analyst.md +43 -0
- package/prompts/personas/murat-tester.md +43 -0
- package/prompts/personas/paige-techwriter.md +43 -0
- package/prompts/personas/sally-ux.md +43 -0
- package/prompts/personas/winston-architect.md +43 -0
- package/agents/design-facilitator.md +0 -8
- package/agents/domain.md +0 -9
- package/agents/exploration.md +0 -8
- package/agents/green.md +0 -9
- package/agents/marvin.md +0 -15
- package/agents/model-checker.md +0 -9
- package/agents/red.md +0 -9
- package/commands/sdlc-domain-audit.md +0 -32
- package/commands/sdlc-plan.md +0 -63
- package/commands/sdlc-pr.md +0 -43
- package/commands/sdlc-setup.md +0 -50
- package/commands/sdlc-start.md +0 -34
- package/commands/sdlc-work.md +0 -118
- package/config/presets/traditional.json +0 -12
- package/skills/adr-policy.md +0 -21
- package/skills/atomic-design.md +0 -39
- package/skills/debugging-protocol.md +0 -47
- package/skills/event-modeling.md +0 -40
- package/skills/git-spice.md +0 -44
- package/skills/github-issues.md +0 -44
- package/skills/memory-protocol.md +0 -41
- package/skills/orchestration.md +0 -118
- package/skills/skill-enforcement.md +0 -56
- package/skills/tdd-constraints.md +0 -63
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin/hooks/session-hooks.ts","../src/plugin/utils/file-patterns.ts","../src/plugin/hooks/tool-hooks.ts","../src/plugin/hooks/compaction-hook.ts","../src/plugin/tools/get-context.ts","../src/plugin/tools/get-state.ts","../src/plugin/tools/update-state.ts","../src/plugin/tools/load-skill.ts","../src/plugin/utils/package-paths.ts","../src/plugin/tools/party-review.ts","../src/plugin/tools/review-store.ts","../src/plugin/tools/index.ts","../src/plugin/state/sdlc-tracker.ts","../src/shared/constants.ts","../src/plugin/utils/config-loader.ts","../src/shared/schemas.ts","../src/plugin/index.ts"],"sourcesContent":["import type { SdlcTracker } from \"../state/sdlc-tracker.js\";\n\ninterface SessionEvent {\n type?: string;\n}\n\nexport function createSessionHooks(_tracker: SdlcTracker): ({ event }: { event: SessionEvent }) => Promise<void> {\n return ({ event }: { event: SessionEvent }): Promise<void> => {\n if (event.type === \"session.created\") {\n return Promise.resolve();\n }\n if (event.type === \"session.idle\") {\n return Promise.resolve();\n }\n return Promise.resolve();\n };\n}\n","import picomatch from \"picomatch\";\n\nexport function matchesAnyPattern(filePath: string, patterns: string[]): boolean {\n if (patterns.length === 0) return false;\n const matcher = picomatch(patterns, { dot: true });\n return matcher(filePath);\n}\n","import type { SdlcConfig } from \"../../shared/types.js\";\nimport type { SdlcTracker } from \"../state/sdlc-tracker.js\";\nimport { matchesAnyPattern } from \"../utils/file-patterns.js\";\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\ninterface AfterHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface AfterHookOutput {\n title: string;\n output: string;\n metadata: unknown;\n}\n\ninterface EditArgs {\n filePath?: string;\n}\n\ninterface WriteArgs {\n filePath?: string;\n}\n\ninterface UpdateStateArgs {\n currentPhase?: \"idle\" | \"red\" | \"domain-after-red\" | \"green\" | \"domain-after-green\";\n}\n\nconst VALID_TRANSITIONS: Record<string, string[]> = {\n idle: [\"red\"],\n red: [\"domain-after-red\"],\n \"domain-after-red\": [\"green\"],\n green: [\"domain-after-green\"],\n \"domain-after-green\": [\"red\", \"idle\"],\n};\n\nexport function createToolHooks(tracker: SdlcTracker, config: SdlcConfig): {\n before: (input: BeforeHookInput, output: BeforeHookOutput) => Promise<void>;\n after: (input: AfterHookInput, output: AfterHookOutput) => Promise<void>;\n} {\n return {\n before: (input: BeforeHookInput, output: BeforeHookOutput): Promise<void> => {\n return Promise.resolve().then(() => {\n if (input.tool === \"sdlc_update_state\") {\n const args = output.args as UpdateStateArgs;\n if (args.currentPhase) {\n const current = tracker.getState().currentPhase;\n const allowed = VALID_TRANSITIONS[current] ?? [];\n if (!allowed.includes(args.currentPhase)) {\n throw new Error(\n `Invalid TDD transition: ${current} -> ${args.currentPhase}. ` +\n `Allowed transitions: ${allowed.join(\", \")}. ` +\n `Follow RED → DOMAIN → GREEN → DOMAIN → REFACTOR.`\n );\n }\n }\n }\n\n if (input.tool === \"edit\" || input.tool === \"write\") {\n const state = tracker.getState();\n const args = output.args as EditArgs | WriteArgs;\n const filePath = args.filePath ?? \"\";\n if (filePath.length === 0) return;\n\n const allowedPatterns = getAllowedPatterns(config, state.currentPhase);\n\n if (allowedPatterns.length > 0 && !matchesAnyPattern(filePath, allowedPatterns)) {\n throw new Error(\n `File ownership violation in phase '${state.currentPhase}'. ` +\n `Allowed patterns: ${allowedPatterns.join(\", \")}. ` +\n `Attempted: ${filePath}. Delegate to the correct agent.`\n );\n }\n }\n });\n },\n\n after: (_input: AfterHookInput, _output: AfterHookOutput): Promise<void> => {\n return Promise.resolve();\n },\n };\n}\n\nfunction getAllowedPatterns(\n config: SdlcConfig,\n phase: \"idle\" | \"red\" | \"domain-after-red\" | \"green\" | \"domain-after-green\"\n): string[] {\n const patterns = config.languages.flatMap((language) => {\n if (phase === \"red\") return language.testPatterns;\n if (phase === \"green\") return language.productionPatterns;\n if (phase === \"domain-after-red\" || phase === \"domain-after-green\") return language.typePatterns;\n return [];\n });\n return patterns.filter(Boolean);\n}\n","import type { SdlcTracker } from \"../state/sdlc-tracker.js\";\n\nexport function createCompactionHook(tracker: SdlcTracker): () => Promise<void> {\n return async () => {\n await tracker.persist();\n };\n}\n","import type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\nexport function createGetContextTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: \"Get SDLC plugin context and config.\",\n args: {},\n execute: () => {\n return Promise.resolve(\n JSON.stringify(\n {\n root: ctx.directory,\n config,\n },\n null,\n 2\n )\n );\n },\n });\n}\n","import { tool } from \"@opencode-ai/plugin\";\nimport type { ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcTracker } from \"../state/sdlc-tracker.js\";\n\nexport function createGetStateTool(tracker: SdlcTracker): ToolDefinition {\n return tool({\n description: \"Get the current SDLC TDD state.\",\n args: {},\n execute: () => {\n return Promise.resolve(JSON.stringify(tracker.getState(), null, 2));\n },\n });\n}\n","import { tool, type ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcTracker } from \"../state/sdlc-tracker.js\";\nimport type { SdlcState } from \"../../shared/types.js\";\n\nexport function createUpdateStateTool(tracker: SdlcTracker): ToolDefinition {\n return tool({\n description: \"Update SDLC TDD state.\",\n args: {\n currentPhase: tool.schema\n .enum([\"idle\", \"red\", \"domain-after-red\", \"green\", \"domain-after-green\"])\n .optional(),\n currentIssue: tool.schema.string().optional(),\n currentTest: tool.schema.string().optional(),\n currentTestFile: tool.schema.string().optional(),\n },\n execute: async (args: Partial<SdlcState>) => {\n tracker.updateState(args);\n await tracker.persist();\n return JSON.stringify(tracker.getState(), null, 2);\n },\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\nimport { getPluginSkillsDir } from \"../utils/package-paths.js\";\n\nexport function createLoadSkillTool(ctx: PluginInput): ToolDefinition {\n return tool({\n description: \"Load SDLC skill markdown by name.\",\n args: {\n skills: tool.schema.array(tool.schema.string()).min(1),\n },\n execute: async ({ skills }: { skills: string[] }) => {\n const skillContents: Record<string, string> = {};\n const pluginSkillsDir = getPluginSkillsDir();\n const localDir = join(ctx.directory, \"skills\");\n\n for (const skill of skills) {\n const fileName = `${skill}.md`;\n const candidatePaths = [join(localDir, fileName), join(pluginSkillsDir, fileName)];\n let content = \"\";\n for (const path of candidatePaths) {\n try {\n content = await readFile(path, \"utf-8\");\n break;\n } catch {\n continue;\n }\n }\n if (!content) {\n content = `Skill not found: ${skill}`;\n }\n skillContents[skill] = content;\n }\n\n return JSON.stringify(skillContents, null, 2);\n },\n });\n}\n","import { existsSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function getPackageRoot(): string {\n const currentFileDir = dirname(fileURLToPath(import.meta.url));\n\n const bundledRoot = join(currentFileDir, \"..\", \"..\", \"..\");\n if (existsSync(join(bundledRoot, \"package.json\"))) {\n return bundledRoot;\n }\n\n const devRoot = join(currentFileDir, \"..\", \"..\", \"..\", \"..\");\n if (existsSync(join(devRoot, \"package.json\"))) {\n return devRoot;\n }\n\n return bundledRoot;\n}\n\nexport function getPluginSkillsDir(): string {\n return join(getPackageRoot(), \"skills\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport { tool, type ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { PartyReviewSession, PartyReviewFinding } from \"../../shared/types.js\";\n\ninterface PartyReviewState {\n session: PartyReviewSession | null;\n}\n\nconst state: PartyReviewState = { session: null };\n\nexport function createPartyReviewTool(): ToolDefinition {\n return tool({\n description: \"Run SDLC party review discussion for findings.\",\n args: {\n action: tool.schema.enum([\"start\", \"next\", \"decide\", \"end\"]),\n findings: tool.schema\n .array(\n tool.schema.object({\n id: tool.schema.string(),\n title: tool.schema.string(),\n severity: tool.schema.enum([\"high\", \"medium\", \"low\"]),\n category: tool.schema.enum([\"logic\", \"security\", \"performance\", \"ux\", \"testing\", \"domain\"]),\n })\n )\n .optional(),\n sessionId: tool.schema.string().optional(),\n findingId: tool.schema.string().optional(),\n decision: tool.schema.enum([\"accept\", \"defer\", \"reject\"]).optional(),\n reason: tool.schema.string().optional(),\n },\n execute: async (args: {\n action: \"start\" | \"next\" | \"decide\" | \"end\";\n findings?: PartyReviewFinding[];\n sessionId?: string;\n findingId?: string;\n decision?: \"accept\" | \"defer\" | \"reject\";\n reason?: string;\n }) =>\n Promise.resolve().then(() => {\n if (args.action === \"start\") {\n const findings = args.findings;\n if (!findings || findings.length === 0) {\n return JSON.stringify({ error: \"findings required\" });\n }\n const sessionId = randomUUID();\n state.session = {\n sessionId,\n findings,\n currentIndex: 0,\n decisions: [],\n };\n return JSON.stringify({ sessionId, current: findings[0] }, null, 2);\n }\n\n const session = state.session;\n if (!session || (args.sessionId !== undefined && args.sessionId !== session.sessionId)) {\n return JSON.stringify({ error: \"session not found\" });\n }\n\n if (args.action === \"next\") {\n const nextIndex = session.currentIndex + 1;\n if (nextIndex >= session.findings.length) {\n return JSON.stringify({ sessionId: session.sessionId, current: null }, null, 2);\n }\n session.currentIndex = nextIndex;\n const current = session.findings[session.currentIndex];\n return JSON.stringify({ sessionId: session.sessionId, current }, null, 2);\n }\n\n if (args.action === \"decide\") {\n if (args.findingId === undefined || args.decision === undefined) {\n return JSON.stringify({ error: \"findingId and decision required\" });\n }\n session.decisions.push({\n findingId: args.findingId,\n decision: args.decision,\n reason: args.reason,\n });\n return JSON.stringify({ sessionId: session.sessionId, decisions: session.decisions }, null, 2);\n }\n\n if (args.action === \"end\") {\n const summary = session;\n state.session = null;\n return JSON.stringify({ summary }, null, 2);\n }\n\n return JSON.stringify({ error: \"unknown action\" });\n }),\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport { tool } from \"@opencode-ai/plugin\";\n\ninterface ReviewSession {\n id: string;\n folder: string;\n createdAt: string;\n}\n\nconst sessions = new Map<string, ReviewSession>();\n\nexport function createReviewStoreTool(ctx: PluginInput): ToolDefinition {\n return tool({\n description: \"Create and persist SDLC review artifacts under .opencode/reviews.\",\n args: {\n action: tool.schema.enum([\"start\", \"write\", \"end\"]),\n reviewId: tool.schema.string().optional(),\n issueId: tool.schema.string().optional(),\n filename: tool.schema.string().optional(),\n content: tool.schema.any().optional(),\n },\n execute: async (args: {\n action: \"start\" | \"write\" | \"end\";\n reviewId?: string;\n issueId?: string;\n filename?: string;\n content?: unknown;\n }) => {\n const reviewsRoot = join(ctx.directory, \".opencode\", \"reviews\");\n await mkdir(reviewsRoot, { recursive: true });\n\n if (args.action === \"start\") {\n const id = randomUUID();\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n const suffix = args.issueId !== undefined && args.issueId !== \"\" ? `-${args.issueId}` : \"\";\n const folder = join(reviewsRoot, `${timestamp}${suffix}`);\n await mkdir(folder, { recursive: true });\n const session: ReviewSession = {\n id,\n folder,\n createdAt: new Date().toISOString(),\n };\n sessions.set(id, session);\n return JSON.stringify({ reviewId: id, folder }, null, 2);\n }\n\n if (args.action !== \"write\" && args.action !== \"end\") {\n return JSON.stringify({ error: \"unknown action\" });\n }\n\n const reviewId = args.reviewId;\n if (reviewId === undefined || !sessions.has(reviewId)) {\n return JSON.stringify({ error: \"review session not found\" });\n }\n\n const session = sessions.get(reviewId);\n if (!session) {\n return JSON.stringify({ error: \"review session missing\" });\n }\n\n if (args.action === \"write\") {\n if (args.filename === undefined) {\n return JSON.stringify({ error: \"filename required\" });\n }\n const content =\n typeof args.content === \"string\" ? args.content : JSON.stringify(args.content ?? {}, null, 2);\n const filePath = join(session.folder, args.filename);\n await writeFile(filePath, content, \"utf-8\");\n return JSON.stringify({ reviewId: session.id, path: filePath }, null, 2);\n }\n\n if (args.action === \"end\") {\n sessions.delete(session.id);\n return JSON.stringify({ reviewId: session.id, folder: session.folder, closed: true }, null, 2);\n }\n\n return JSON.stringify({ error: \"unknown action\" });\n },\n });\n}\n","import type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { SdlcTracker } from \"../state/sdlc-tracker.js\";\nimport { createGetContextTool } from \"./get-context.js\";\nimport { createGetStateTool } from \"./get-state.js\";\nimport { createUpdateStateTool } from \"./update-state.js\";\nimport { createLoadSkillTool } from \"./load-skill.js\";\nimport { createPartyReviewTool } from \"./party-review.js\";\nimport { createReviewStoreTool } from \"./review-store.js\";\n\nexport function createTools(\n ctx: PluginInput,\n tracker: SdlcTracker,\n config: SdlcConfig\n): Record<string, ToolDefinition> {\n return {\n sdlc_get_context: createGetContextTool(ctx, config),\n sdlc_get_state: createGetStateTool(tracker),\n sdlc_update_state: createUpdateStateTool(tracker),\n sdlc_load_skill: createLoadSkillTool(ctx),\n sdlc_party_review: createPartyReviewTool(),\n sdlc_review_store: createReviewStoreTool(ctx),\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { STATE_FILE_NAME } from \"../../shared/constants.js\";\nimport type { SdlcState } from \"../../shared/types.js\";\n\nexport class SdlcTracker {\n private state: SdlcState = {\n currentPhase: \"idle\",\n lastUpdated: new Date().toISOString(),\n };\n\n constructor(private directory: string) {}\n\n async initialize(): Promise<void> {\n const statePath = join(this.directory, \".opencode\", STATE_FILE_NAME);\n if (existsSync(statePath)) {\n const raw = await readFile(statePath, \"utf-8\");\n this.state = JSON.parse(raw) as SdlcState;\n } else {\n await this.persist();\n }\n }\n\n getState(): SdlcState {\n return this.state;\n }\n\n updateState(patch: Partial<SdlcState>): SdlcState {\n this.state = {\n ...this.state,\n ...patch,\n lastUpdated: new Date().toISOString(),\n };\n return this.state;\n }\n\n async persist(): Promise<void> {\n const stateDir = join(this.directory, \".opencode\");\n const statePath = join(stateDir, STATE_FILE_NAME);\n if (!existsSync(stateDir)) {\n await mkdir(stateDir, { recursive: true });\n }\n await writeFile(statePath, JSON.stringify(this.state, null, 2));\n }\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport const VERSION = \"0.2.1\";\nexport const DISPLAY_NAME = \"OpenCode SDLC Plugin\";\nexport const TAGLINE = \"Agentic SDLC workflow with discovery, ADRs, and TDD\";\n\nexport const PACKAGE_NAME = \"opencode-sdlc-plugin\";\n\nexport const GLOBAL_CONFIG_DIR = join(homedir(), \".config\", \"opencode\");\nexport const LOCAL_CONFIG_DIR_NAME = \".opencode\";\n\nexport const CONFIG_FILE_NAME = \"sdlc.json\";\nexport const STATE_FILE_NAME = \"sdlc-state.json\";\nexport const OPENCODE_CONFIG_NAME = \"opencode.json\";\nexport const OMO_CONFIG_NAME = \"oh-my-opencode.json\";\nexport const COMMAND_DIR_NAME = \"command\";\n\nexport const DEFAULT_AGENT_MODEL = \"anthropic/claude-sonnet-4-5-thinking\";\n\nexport const CONFIG_PATHS = {\n globalConfigDir: GLOBAL_CONFIG_DIR,\n globalSdlcConfig: join(GLOBAL_CONFIG_DIR, CONFIG_FILE_NAME),\n globalOpencodeConfig: join(GLOBAL_CONFIG_DIR, OPENCODE_CONFIG_NAME),\n globalOhMyOpencodeConfig: join(GLOBAL_CONFIG_DIR, OMO_CONFIG_NAME),\n commandsDir: join(GLOBAL_CONFIG_DIR, COMMAND_DIR_NAME),\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { CONFIG_FILE_NAME, CONFIG_PATHS } from \"../../shared/constants.js\";\nimport { sdlcConfigSchema } from \"../../shared/schemas.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\nexport function loadSdlcConfig(directory: string): SdlcConfig {\n const localPath = join(directory, \".opencode\", CONFIG_FILE_NAME);\n const globalPath = join(CONFIG_PATHS.globalConfigDir, CONFIG_FILE_NAME);\n\n const configPath = existsSync(localPath) ? localPath : globalPath;\n\n if (!existsSync(configPath)) {\n return {\n version: \"0.0.0\",\n mode: \"event-modeling\",\n git: { workflow: \"standard\", worktrees: false, requireClean: false },\n features: { atomicDesign: true, gitSpice: false },\n github: {},\n languages: [\n {\n name: \"typescript\",\n testPatterns: [\"**/*.test.ts\", \"**/*.spec.ts\"],\n productionPatterns: [\"src/**/*.ts\"],\n typePatterns: [\"src/**/*types.ts\", \"src/**/*types/*.ts\"],\n },\n ],\n };\n }\n\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = JSON.parse(raw) as SdlcConfig;\n return sdlcConfigSchema.parse(parsed);\n}\n","import { z } from \"zod\";\n\nexport const languageConfigSchema = z.object({\n name: z.string().min(1),\n testPatterns: z.array(z.string()).min(1),\n productionPatterns: z.array(z.string()).min(1),\n typePatterns: z.array(z.string()).min(1),\n});\n\nexport const sdlcConfigSchema = z.object({\n version: z.string(),\n mode: z.enum([\"event-modeling\", \"traditional\"]),\n git: z.object({\n workflow: z.enum([\"git-spice\", \"standard\"]),\n worktrees: z.boolean(),\n requireClean: z.boolean(),\n }),\n features: z.object({\n atomicDesign: z.boolean(),\n gitSpice: z.boolean(),\n }),\n github: z.object({\n owner: z.string().optional(),\n project: z.number().optional(),\n }),\n languages: z.array(languageConfigSchema).min(1),\n});\n\nexport type SdlcConfigSchema = z.infer<typeof sdlcConfigSchema>;\n","import type { Plugin } from \"@opencode-ai/plugin\";\nimport { createSessionHooks } from \"./hooks/session-hooks.js\";\nimport { createToolHooks } from \"./hooks/tool-hooks.js\";\nimport { createCompactionHook } from \"./hooks/compaction-hook.js\";\nimport { createTools } from \"./tools/index.js\";\nimport { SdlcTracker } from \"./state/sdlc-tracker.js\";\nimport { loadSdlcConfig } from \"./utils/config-loader.js\";\n\nexport const SdlcPlugin: Plugin = async (ctx) => {\n const config = loadSdlcConfig(ctx.directory);\n const tracker = new SdlcTracker(ctx.directory);\n await tracker.initialize();\n\n const tools = createTools(ctx, tracker, config);\n const sessionHooks = createSessionHooks(tracker);\n const toolHooks = createToolHooks(tracker, config);\n const compactionHook = createCompactionHook(tracker);\n\n return {\n tool: tools,\n event: sessionHooks,\n \"tool.execute.before\": toolHooks.before,\n \"tool.execute.after\": toolHooks.after,\n \"experimental.session.compacting\": compactionHook,\n };\n};\n\nexport default SdlcPlugin;\n"],"mappings":"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","names":["state","tool","tool","join","tool","tool","join","tool","join","randomUUID","tool","session","existsSync","mkdir","readFile","writeFile","join","join","join","join","join","existsSync","readFile","mkdir","writeFile","existsSync","join","join","existsSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/plugin/utils/plugin-logger.ts","../src/plugin/utils/notifications.ts","../src/plugin/hooks/session-hooks.ts","../src/plugin/utils/github-issues.ts","../src/plugin/utils/tdd-file-ownership.ts","../src/plugin/hooks/orchestrator-guard.ts","../src/plugin/utils/issue-parser.ts","../src/plugin/utils/issue-todo-sync.ts","../src/plugin/hooks/todo-hooks.ts","../src/plugin/hooks/tool-hooks.ts","../src/plugin/hooks/compaction-hook.ts","../src/plugin/tracker/tdd-cycle-tracker.ts","../src/plugin/tools/adr.ts","../src/shared/constants.ts","../src/plugin/tools/config.ts","../src/plugin/tools/event-design-workflow.ts","../src/plugin/tools/event-discover-domain.ts","../src/plugin/tools/event-generate-gwt.ts","../src/plugin/tools/event-validate-model.ts","../src/plugin/tools/get-context.ts","../src/plugin/tools/get-issue.ts","../src/plugin/tools/list-issues.ts","../src/plugin/tools/memory-remember.ts","../src/plugin/tools/memory-recall.ts","../src/plugin/tools/mutation.ts","../src/plugin/utils/issue-review-updater.ts","../src/plugin/utils/oracle-parser.ts","../src/shared/types.ts","../src/plugin/utils/persona-loader.ts","../src/plugin/tools/party-discussion.ts","../src/plugin/tools/party-review.ts","../src/plugin/tools/review-pr.ts","../src/plugin/utils/agent-selector.ts","../src/plugin/utils/issue-review-utils.ts","../src/plugin/tools/story-review-analyze.ts","../src/plugin/utils/response-synthesizer.ts","../src/plugin/tools/story-review-consult.ts","../src/plugin/tools/tdd-domain.ts","../src/plugin/tools/tdd-green.ts","../src/plugin/tools/tdd-red.ts","../src/plugin/tools/update-issue-status.ts","../src/plugin/tools/index.ts","../src/plugin/tracker/issue-tracker.ts","../src/shared/schemas.ts","../src/plugin/utils/config-loader.ts","../src/plugin/index.ts"],"names":["log","patterns","suggestedPhase","minimatch","join","existsSync","dirname","readFileSync","tool","readFile","mkdir","writeFile","parseModelConfig","readdir","homedir","loadMemoryStore","isMementoEnabled","randomUUID","parseAgentResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Plugin Logger - File-based logging for OpenCode SDLC plugin runtime\n *\n * Follows oh-my-opencode logging pattern:\n * - Logs to temp file: ${TMPDIR}/opencode-sdlc.log\n * - Optional console output: ATHENA_DEBUG=1\n * - Silent failures to prevent breaking plugin execution\n */\n\nimport { appendFileSync, existsSync, statSync, truncateSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst LOG_FILE = join(tmpdir(), \"opencode-sdlc.log\");\nconst MAX_LOG_SIZE = 5 * 1024 * 1024;\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LEVEL_PREFIXES: Record<LogLevel, string> = {\n debug: \"[DEBUG]\",\n info: \"[INFO]\",\n warn: \"[WARN]\",\n error: \"[ERROR]\",\n};\n\nfunction shouldLog(level: LogLevel): boolean {\n if (level === \"warn\" || level === \"error\") return true;\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction shouldConsoleLog(): boolean {\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction formatLogEntry(\n level: LogLevel,\n component: string,\n message: string,\n data?: Record<string, unknown>\n): string {\n const timestamp = new Date().toISOString();\n const prefix = LEVEL_PREFIXES[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : \"\";\n return `[${timestamp}] ${prefix} [${component}] ${message}${dataStr}\\n`;\n}\n\nfunction rotateLogIfNeeded(): void {\n try {\n if (existsSync(LOG_FILE)) {\n const stats = statSync(LOG_FILE);\n if (stats.size > MAX_LOG_SIZE) {\n truncateSync(LOG_FILE, 0);\n }\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\nfunction writeLog(entry: string): void {\n try {\n rotateLogIfNeeded();\n appendFileSync(LOG_FILE, entry);\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\n/**\n * Create a scoped logger for a specific component.\n * Public API - docstring required for discoverability.\n *\n * @example\n * const log = createPluginLogger(\"party-discussion\");\n * log.debug(\"Starting session\", { sessionId: \"abc123\" });\n */\nexport function createPluginLogger(component: string) {\n return {\n debug: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"debug\")) return;\n const entry = formatLogEntry(\"debug\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.debug(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n info: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"info\")) return;\n const entry = formatLogEntry(\"info\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.info(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n warn: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"warn\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.warn(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n error: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"error\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.error(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n };\n}\n\n/** Returns log file path: ${TMPDIR}/opencode-sdlc.log */\nexport function getLogFilePath(): string {\n return LOG_FILE;\n}\n\n/** Truncates the log file to zero bytes */\nexport function clearLog(): void {\n try {\n if (existsSync(LOG_FILE)) {\n truncateSync(LOG_FILE, 0);\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n","/**\n * Cross-platform notification utility\n *\n * Sends desktop notifications on macOS/Linux, falls back to console on Windows.\n */\n\nimport { platform } from \"node:os\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\ntype ShellExecutor = PluginInput[\"$\"];\n\nconst log = createPluginLogger(\"notifications\");\n\n/**\n * Send a desktop notification\n *\n * Platform support:\n * - macOS: Uses osascript (built-in)\n * - Linux: Uses notify-send (requires libnotify)\n * - Windows: Falls back to console.log\n *\n * @param message - The notification message\n * @param title - The notification title\n * @param $ - Shell executor from plugin context\n */\nexport async function sendNotification(\n message: string,\n title: string,\n $: ShellExecutor\n): Promise<void> {\n const os = platform();\n\n try {\n if (os === \"darwin\") {\n // macOS - use osascript (built-in)\n await $`osascript -e ${`display notification \"${escapeAppleScript(message)}\" with title \"${escapeAppleScript(title)}\"`}`;\n } else if (os === \"linux\") {\n // Linux - use notify-send (requires libnotify)\n await $`notify-send ${title} ${message}`;\n } else {\n // Windows and others - fall back to console\n logNotification(title, message);\n }\n } catch {\n // Silently fall back to console if notification fails\n logNotification(title, message);\n }\n}\n\n/**\n * Escape special characters for AppleScript strings\n */\nfunction escapeAppleScript(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Log notification to log file as fallback\n */\nfunction logNotification(title: string, message: string): void {\n log.info(\"Desktop notification fallback\", { title, message });\n}\n","/**\n * Session event hooks\n *\n * Handles session lifecycle events like idle, created, and error.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { sendNotification } from \"../utils/notifications.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"session-hooks\");\n\n/**\n * Generic event type for session events\n */\ninterface SessionEvent {\n type?: string;\n error?: unknown;\n}\n\n/**\n * Check if config has orchestratorOnly feature enabled\n */\nfunction isOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n return false;\n}\n\n/**\n * Create session event handler\n *\n * Handles:\n * - session.idle: Reminds about active issue when session goes idle\n * - session.created: Logs resume of tracked issue + orchestration reminder\n * - session.error: Logs errors during issue work\n */\nexport function createSessionHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n return async ({ event }: { event: SessionEvent }) => {\n // Event type is in event.type for most events\n const eventType = (event as { type?: string }).type;\n\n switch (eventType) {\n case \"session.idle\":\n await handleSessionIdle(ctx, tracker, config);\n break;\n\n case \"session.created\":\n handleSessionCreated(tracker, config);\n break;\n\n case \"session.error\":\n handleSessionError(event, tracker);\n break;\n }\n };\n}\n\n/**\n * Handle session going idle\n *\n * If an issue is active, send a reminder notification\n */\nasync function handleSessionIdle(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Promise<void> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n const normalized = currentIssue.status.toLowerCase();\n if (!normalized.includes(\"in progress\") && !normalized.includes(\"in-progress\")) {\n return;\n }\n if (config.features?.notifications) {\n await sendNotification(\n `Issue #${currentIssue.issueNumber} in progress. Remember to update status when complete!`,\n \"OpenCode SDLC\",\n ctx.$\n );\n }\n }\n}\n\n/**\n * Handle session creation\n *\n * Log if resuming with an active issue and show orchestration reminder\n */\nfunction handleSessionCreated(tracker: IssueTracker, config: SdlcConfig): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n log.info(\"Session created - resuming with issue\", {\n issueNumber: currentIssue.issueNumber,\n status: currentIssue.status,\n });\n }\n\n // Log orchestration reminder if feature is enabled\n if (isOrchestratorOnlyEnabled(config)) {\n log.info(\"Orchestrator-only mode active\", {\n hint: \"Use sdlc_red/sdlc_green/sdlc_domain for file edits\",\n });\n }\n}\n\n/**\n * Handle session errors\n *\n * Log errors that occur during issue work\n */\nfunction handleSessionError(event: SessionEvent, tracker: IssueTracker): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue && event.error) {\n log.error(\"Session error during issue work\", {\n issueNumber: currentIssue.issueNumber,\n error: event.error,\n });\n }\n}\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"github-issues\");\n\nexport interface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n url: string;\n state: string;\n}\n\nexport interface IssueListItem {\n number: number;\n title: string;\n url: string;\n state: string;\n status?: string;\n}\n\nfunction getRepo(config: SdlcConfig): { owner: string; repo: string } | null {\n if (!config.github?.owner || !config.github?.repo) return null;\n return { owner: config.github.owner, repo: config.github.repo };\n}\n\nexport async function fetchIssue(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number\n): Promise<GitHubIssue | null> {\n const repo = getRepo(config);\n if (!repo) return null;\n\n try {\n const { stdout } =\n await ctx.$`gh issue view ${issueNumber} --repo ${repo.owner}/${repo.repo} --json number,title,body,url,state`;\n const output = String(stdout).trim();\n const issue = JSON.parse(output) as GitHubIssue;\n return issue;\n } catch (error) {\n log.warn(\"Failed to fetch issue\", { issueNumber, error: String(error) });\n return null;\n }\n}\n\nexport async function listIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n status?: string,\n limit = 20\n): Promise<IssueListItem[]> {\n const repo = getRepo(config);\n if (!repo) return [];\n\n try {\n const statusFilter = status ? `--search \"project:${status}\"` : \"\";\n const { stdout } =\n await ctx.$`gh issue list --repo ${repo.owner}/${repo.repo} ${statusFilter} --limit ${limit} --json number,title,url,state`;\n const output = String(stdout).trim();\n const issues = JSON.parse(output) as IssueListItem[];\n return issues;\n } catch (error) {\n log.warn(\"Failed to list issues\", { status, error: String(error) });\n return [];\n }\n}\n\nexport async function moveIssueToStatus(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n status: string\n): Promise<boolean> {\n const repo = getRepo(config);\n if (!repo || !config.github?.project) return false;\n\n try {\n await ctx.$`gh project-ext move ${issueNumber} \"${status}\" --owner ${config.github.owner} --project ${config.github.project}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to move issue\", { issueNumber, status, error: String(error) });\n return false;\n }\n}\n\nexport async function updateIssueBody(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n body: string\n): Promise<boolean> {\n const repo = getRepo(config);\n if (!repo) return false;\n\n try {\n await ctx.$`gh issue edit ${issueNumber} --repo ${repo.owner}/${repo.repo} --body ${body}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to update issue body\", { issueNumber, error: String(error) });\n return false;\n }\n}\n","/**\n * TDD File Ownership Enforcement\n *\n * Determines which files each TDD phase agent can edit based on configurable patterns.\n */\n\nimport { minimatch } from \"minimatch\";\n\n/**\n * TDD phase types\n */\nexport type TddPhase = \"red\" | \"green\" | \"domain\";\n\n/**\n * Default file patterns for each TDD phase\n */\nexport const DEFAULT_FILE_PATTERNS: Record<TddPhase, { canEdit: string[]; cannotEdit: string[] }> =\n {\n red: {\n canEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**/*.ts\",\n \"**/__tests__/**/*.tsx\",\n \"**/tests/**/*.ts\",\n \"**/tests/**/*.tsx\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n green: {\n canEdit: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"],\n cannotEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**\",\n \"**/tests/**\",\n \"**/node_modules/**\",\n \"**/*.d.ts\",\n ],\n },\n domain: {\n canEdit: [\n \"**/types.ts\",\n \"**/types/**/*.ts\",\n \"**/*.types.ts\",\n \"**/domain/**/*.ts\",\n \"**/models/**/*.ts\",\n \"**/*.d.ts\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n };\n\n/**\n * File ownership configuration\n */\nexport interface FileOwnershipConfig {\n /** Patterns for files the RED phase can edit (tests) */\n redPatterns?: string[];\n /** Patterns for files the GREEN phase can edit (implementation) */\n greenPatterns?: string[];\n /** Patterns for files the DOMAIN phase can edit (types) */\n domainPatterns?: string[];\n /** Patterns to always exclude */\n excludePatterns?: string[];\n}\n\n/**\n * Result of a file ownership check\n */\nexport interface FileOwnershipResult {\n /** Whether the file can be edited in this phase */\n allowed: boolean;\n /** Reason for the decision */\n reason: string;\n /** The phase that was checked */\n phase: TddPhase;\n /** The file path that was checked */\n filePath: string;\n /** Suggested phase if edit is not allowed */\n suggestedPhase?: TddPhase;\n}\n\n/**\n * Create a file ownership checker for a specific configuration\n */\nexport function createFileOwnershipChecker(config?: FileOwnershipConfig) {\n const patterns = {\n red: {\n canEdit: config?.redPatterns ?? DEFAULT_FILE_PATTERNS.red.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.red.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n green: {\n canEdit: config?.greenPatterns ?? DEFAULT_FILE_PATTERNS.green.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.green.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n domain: {\n canEdit: config?.domainPatterns ?? DEFAULT_FILE_PATTERNS.domain.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.domain.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n };\n\n /**\n * Check if a file matches any of the given patterns\n */\n function matchesAny(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => minimatch(filePath, pattern, { dot: true }));\n }\n\n /**\n * Find which phase should own a file\n */\n function findSuggestedPhase(filePath: string): TddPhase | undefined {\n // Check if it's a test file -> RED\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.red.canEdit)) {\n return \"red\";\n }\n\n // Check if it's a type definition file -> DOMAIN\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.domain.canEdit)) {\n return \"domain\";\n }\n\n // Default to GREEN for implementation files\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.green.canEdit)) {\n return \"green\";\n }\n\n return undefined;\n }\n\n /**\n * Check if a file can be edited in a specific TDD phase\n */\n function canEdit(filePath: string, phase: TddPhase): FileOwnershipResult {\n const phasePatterns = patterns[phase];\n\n // First check exclusions\n if (matchesAny(filePath, phasePatterns.cannotEdit)) {\n const suggestedPhase = findSuggestedPhase(filePath);\n return {\n allowed: false,\n reason: `File matches exclusion pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n suggestedPhase,\n };\n }\n\n // Then check if it matches allowed patterns\n if (matchesAny(filePath, phasePatterns.canEdit)) {\n return {\n allowed: true,\n reason: `File matches allowed pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n };\n }\n\n // Not allowed by default\n const suggestedPhase = findSuggestedPhase(filePath);\n return {\n allowed: false,\n reason: `File does not match any allowed pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n suggestedPhase,\n };\n }\n\n /**\n * Validate multiple file edits for a phase\n */\n function validateEdits(\n filePaths: string[],\n phase: TddPhase\n ): { valid: boolean; results: FileOwnershipResult[] } {\n const results = filePaths.map((fp) => canEdit(fp, phase));\n const valid = results.every((r) => r.allowed);\n return { valid, results };\n }\n\n /**\n * Get a human-readable description of what files a phase can edit\n */\n function describePhaseAccess(phase: TddPhase): string {\n const phasePatterns = patterns[phase];\n const canEditStr = phasePatterns.canEdit.join(\", \");\n const cannotEditStr = phasePatterns.cannotEdit.join(\", \");\n\n return `${phase.toUpperCase()} phase:\n Can edit: ${canEditStr}\n Cannot edit: ${cannotEditStr}`;\n }\n\n return {\n canEdit,\n validateEdits,\n describePhaseAccess,\n patterns,\n };\n}\n\n/**\n * Default file ownership checker with standard patterns\n */\nexport const defaultFileOwnershipChecker = createFileOwnershipChecker();\n\n/**\n * Check if a file is a test file\n */\nexport function isTestFile(filePath: string): boolean {\n return defaultFileOwnershipChecker.canEdit(filePath, \"red\").allowed;\n}\n\n/**\n * Check if a file is a type definition file\n */\nexport function isTypeFile(filePath: string): boolean {\n return defaultFileOwnershipChecker.canEdit(filePath, \"domain\").allowed;\n}\n\n/**\n * Check if a file is an implementation file (not test, not types)\n */\nexport function isImplementationFile(filePath: string): boolean {\n return (\n defaultFileOwnershipChecker.canEdit(filePath, \"green\").allowed &&\n !isTestFile(filePath) &&\n !isTypeFile(filePath)\n );\n}\n\n/**\n * Get enforcement message for a file ownership violation\n */\nexport function getViolationMessage(result: FileOwnershipResult): string {\n if (result.allowed) {\n return `File ${result.filePath} can be edited in ${result.phase.toUpperCase()} phase`;\n }\n\n let message = `VIOLATION: Cannot edit ${result.filePath} in ${result.phase.toUpperCase()} phase.\\n`;\n message += `Reason: ${result.reason}\\n`;\n\n if (result.suggestedPhase) {\n message += `Suggestion: This file should be edited in the ${result.suggestedPhase.toUpperCase()} phase.`;\n }\n\n return message;\n}\n","import { minimatch } from \"minimatch\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport {\n type TddPhase,\n createFileOwnershipChecker,\n getViolationMessage,\n} from \"../utils/tdd-file-ownership.js\";\n\nconst log = createPluginLogger(\"orchestrator-guard\");\n\n/**\n * Subagent types that can write files\n */\nexport type SubagentType = TddPhase | \"file_updater\";\n\n/**\n * Tracks registered subagent sessions\n */\nconst subagentSessions = new Map<string, SubagentType>();\n\n/**\n * Register a session as a subagent session\n *\n * Called by TDD tools when they spawn subagent sessions.\n */\nexport function registerSubagentSession(sessionId: string, type: SubagentType): void {\n log.debug(\"Registering subagent session\", { sessionId, type });\n subagentSessions.set(sessionId, type);\n}\n\n/**\n * Unregister a subagent session\n *\n * Called when a subagent session completes.\n */\nexport function unregisterSubagentSession(sessionId: string): void {\n log.debug(\"Unregistering subagent session\", { sessionId });\n subagentSessions.delete(sessionId);\n}\n\n/**\n * Check if a session is a registered subagent\n */\nexport function isSubagentSession(sessionId: string): boolean {\n return subagentSessions.has(sessionId);\n}\n\n/**\n * Get the subagent type for a session\n */\nexport function getSubagentType(sessionId: string): SubagentType | undefined {\n return subagentSessions.get(sessionId);\n}\n\n/**\n * Clear all registered subagent sessions\n * Useful for testing\n */\nexport function clearSubagentSessions(): void {\n subagentSessions.clear();\n}\n\n/**\n * Get count of registered subagent sessions\n * Useful for debugging\n */\nexport function getSubagentSessionCount(): number {\n return subagentSessions.size;\n}\n\n/**\n * File write tools that should be blocked in orchestrator context\n */\nconst FILE_WRITE_TOOLS = [\"Edit\", \"Write\", \"edit\", \"write\"];\n\n/**\n * Patterns for files that the file_updater subagent can edit\n */\nconst FILE_UPDATER_PATTERNS = [\n // Config files\n \"**/*.json\",\n \"**/*.yaml\",\n \"**/*.yml\",\n \"**/*.toml\",\n \"**/.*rc\",\n \"**/.*rc.js\",\n \"**/.*rc.json\",\n // Documentation\n \"**/*.md\",\n \"**/README*\",\n \"**/CHANGELOG*\",\n \"**/LICENSE*\",\n // Scripts\n \"**/scripts/**\",\n \"**/bin/**\",\n \"**/*.sh\",\n // Build/CI\n \"**/Makefile\",\n \"**/Dockerfile*\",\n \"**/.github/**\",\n \"**/.gitlab-ci*\",\n];\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\n/**\n * Result of orchestrator guard check\n */\nexport interface GuardResult {\n allowed: boolean;\n reason: string;\n suggestion?: string;\n}\n\n/**\n * Extract file path from tool arguments\n */\nfunction extractFilePath(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") {\n return undefined;\n }\n\n const argsObj = args as Record<string, unknown>;\n\n // Edit tool uses filePath\n if (typeof argsObj.filePath === \"string\") {\n return argsObj.filePath;\n }\n\n // Write tool might use path or filePath\n if (typeof argsObj.path === \"string\") {\n return argsObj.path;\n }\n\n // Some tools use file\n if (typeof argsObj.file === \"string\") {\n return argsObj.file;\n }\n\n return undefined;\n}\n\n/**\n * Check if a file matches file_updater patterns\n */\nfunction isFileUpdaterFile(filePath: string): boolean {\n return FILE_UPDATER_PATTERNS.some((pattern) => minimatch(filePath, pattern, { dot: true }));\n}\n\n/**\n * Check if an edit is allowed for a subagent\n */\nfunction checkSubagentAccess(\n filePath: string,\n subagentType: SubagentType,\n _config: SdlcConfig\n): GuardResult {\n // file_updater can edit config/docs/scripts\n if (subagentType === \"file_updater\") {\n if (isFileUpdaterFile(filePath)) {\n return {\n allowed: true,\n reason: `file_updater can edit config/docs/scripts: ${filePath}`,\n };\n }\n return {\n allowed: false,\n reason: `file_updater cannot edit source files: ${filePath}`,\n suggestion: \"Use sdlc_red, sdlc_green, or sdlc_domain for source file edits\",\n };\n }\n\n // TDD phases use file ownership checker with default patterns\n const checker = createFileOwnershipChecker();\n const result = checker.canEdit(filePath, subagentType as TddPhase);\n\n if (result.allowed) {\n return {\n allowed: true,\n reason: result.reason,\n };\n }\n\n return {\n allowed: false,\n reason: getViolationMessage(result),\n suggestion: result.suggestedPhase\n ? `Use sdlc_${result.suggestedPhase} to edit this file`\n : undefined,\n };\n}\n\n/**\n * Get orchestratorOnly feature setting from config\n * Handles both new-style SdlcFeatures and LegacyFeatures\n */\nfunction getOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n\n // Check if it's new-style SdlcFeatures (has orchestratorOnly property)\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n\n // Legacy features don't have orchestratorOnly\n return false;\n}\n\n/**\n * Create the orchestrator guard hook\n *\n * Returns a before hook that enforces the orchestrator-only pattern.\n */\nexport function createOrchestratorGuard(config: SdlcConfig) {\n const enabled = getOrchestratorOnlyEnabled(config);\n\n return {\n /**\n * Before hook - checks if file writes are allowed\n *\n * Blocks Edit/Write in main orchestrator context.\n * For subagent sessions, enforces file ownership rules.\n */\n check: (input: BeforeHookInput, output: BeforeHookOutput): GuardResult => {\n // Feature not enabled - allow everything\n if (!enabled) {\n return { allowed: true, reason: \"orchestratorOnly feature not enabled\" };\n }\n\n // Not a file write tool - allow\n if (!FILE_WRITE_TOOLS.includes(input.tool)) {\n return { allowed: true, reason: `${input.tool} is not a file write tool` };\n }\n\n const filePath = extractFilePath(output.args);\n if (!filePath) {\n log.warn(\"Could not extract file path from tool args\", {\n tool: input.tool,\n args: output.args,\n });\n // Allow but log - we can't enforce what we can't detect\n return { allowed: true, reason: \"Could not determine target file path\" };\n }\n\n // Check if this is a subagent session\n const subagentType = getSubagentType(input.sessionID);\n\n if (subagentType) {\n // This is a subagent - check file ownership\n log.debug(\"Checking subagent file access\", {\n sessionID: input.sessionID,\n subagentType,\n filePath,\n });\n return checkSubagentAccess(filePath, subagentType, config);\n }\n\n // This is the main orchestrator - block the write\n log.info(\"Blocking file write from main orchestrator\", {\n tool: input.tool,\n filePath,\n sessionID: input.sessionID,\n });\n\n return {\n allowed: false,\n reason:\n \"Main orchestrator cannot write files directly. \" +\n \"All file operations must be delegated to specialized agents.\",\n suggestion:\n \"Use sdlc_red for test files, sdlc_green for implementation, \" +\n \"sdlc_domain for types, or sdlc_file_updater for config/docs.\",\n };\n },\n };\n}\n\n/**\n * Format a guard result as an error message for the agent\n */\nexport function formatGuardError(result: GuardResult): string {\n let message = `⛔ ORCHESTRATOR GUARD: ${result.reason}`;\n if (result.suggestion) {\n message += `\\n\\n💡 Suggestion: ${result.suggestion}`;\n }\n return message;\n}\n","import { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-parser\");\n\nexport interface ParsedAcceptanceCriterion {\n id: string;\n text: string;\n checked: boolean;\n}\n\nconst CHECKBOX_PATTERN = /^\\s*- \\[([ xX])\\] (.+)$/;\nconst AC_HEADER_PATTERN = /^#+\\s+Acceptance Criteria/i;\n\n/**\n * Parse acceptance criteria from a GitHub issue body.\n */\nexport function parseAcceptanceCriteria(body: string | null): ParsedAcceptanceCriterion[] {\n if (!body) return [];\n\n const lines = body.split(\"\\n\");\n const criteria: ParsedAcceptanceCriterion[] = [];\n let inAcSection = false;\n let index = 0;\n\n for (const line of lines) {\n if (AC_HEADER_PATTERN.test(line)) {\n inAcSection = true;\n continue;\n }\n\n if (inAcSection && line.startsWith(\"#\")) {\n // Reached next header\n break;\n }\n\n if (!inAcSection) continue;\n\n const match = line.match(CHECKBOX_PATTERN);\n if (!match) continue;\n\n index++;\n const checked = match[1].toLowerCase() === \"x\";\n const text = match[2].trim();\n\n criteria.push({\n id: `AC${index}`,\n text,\n checked,\n });\n }\n\n if (criteria.length === 0) {\n log.debug(\"No acceptance criteria found in issue body\");\n }\n\n return criteria;\n}\n","import type { OpenCodeTodo } from \"../../shared/types.js\";\nimport { parseAcceptanceCriteria } from \"./issue-parser.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-todo-sync\");\n\nexport const ISSUE_TODO_SEPARATOR = \"Δ\";\n\nexport interface IssueTodo {\n id: string;\n issueNumber: number;\n section: string;\n index: number;\n text: string;\n checked: boolean;\n}\n\n/**\n * Convert issue acceptance criteria into OpenCode todos.\n */\nexport function issueCriteriaToTodos(issueNumber: number, body: string | null): OpenCodeTodo[] {\n const criteria = parseAcceptanceCriteria(body);\n return criteria.map((item, index) => ({\n id: `${issueNumber}:ac:${index + 1}`,\n content: `[#${issueNumber}${ISSUE_TODO_SEPARATOR}AC${index + 1}] ${item.text}`,\n status: item.checked ? \"completed\" : \"pending\",\n priority: \"high\",\n }));\n}\n\n/**\n * Parse issue todo ID into parts.\n */\nconst ISSUE_TODO_PATTERN = /^\\s*\\[#\\d+Δ/;\n\nexport function parseIssueTodoId(todoId: string): IssueTodo | null {\n const parts = todoId.split(\":\");\n if (parts.length !== 3) return null;\n\n const [issueStr, section, indexStr] = parts;\n const issueNumber = Number.parseInt(issueStr, 10);\n const index = Number.parseInt(indexStr, 10);\n if (!issueNumber || !index) return null;\n\n return {\n id: todoId,\n issueNumber,\n section,\n index,\n text: \"\",\n checked: false,\n };\n}\n\nexport function isIssueTodo(todo: OpenCodeTodo): boolean {\n return ISSUE_TODO_PATTERN.test(todo.content);\n}\n\n/**\n * Update a GitHub issue body to toggle a checkbox.\n */\nexport async function updateIssueCheckbox(\n issueBody: string,\n criterionIndex: number,\n checked: boolean\n): Promise<string> {\n const lines = issueBody.split(\"\\n\");\n let currentIndex = 0;\n let inAcSection = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (/^#+\\s+Acceptance Criteria/i.test(line)) {\n inAcSection = true;\n continue;\n }\n if (inAcSection && line.startsWith(\"#\")) {\n break;\n }\n if (!inAcSection) continue;\n\n const match = line.match(/^\\s*- \\[([ xX])\\] (.+)$/);\n if (!match) continue;\n\n currentIndex++;\n if (currentIndex === criterionIndex) {\n lines[i] = line.replace(/- \\[[ xX]\\]/, checked ? \"- [x]\" : \"- [ ]\");\n break;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Merge new issue todos with existing ones.\n */\nexport function mergeIssueTodos(\n existing: OpenCodeTodo[],\n newTodos: OpenCodeTodo[]\n): OpenCodeTodo[] {\n const userTodos = existing.filter((t) => !t.content.includes(ISSUE_TODO_SEPARATOR));\n return [...userTodos, ...newTodos];\n}\n\n/**\n * Sync todo completion back to issue body.\n */\nexport async function syncTodoCompletion(\n issueNumber: number,\n todo: OpenCodeTodo,\n previousTodos: OpenCodeTodo[],\n issueBody: string\n): Promise<string | null> {\n const prev = previousTodos.find((t) => t.id === todo.id);\n if (!prev || prev.status === todo.status) return null;\n\n const parsed = parseIssueTodoId(todo.id);\n if (!parsed) return null;\n\n const checked = todo.status === \"completed\";\n const updatedBody = await updateIssueCheckbox(issueBody, parsed.index, checked);\n\n log.info(\"Updated issue checkbox\", { issueNumber, criterionIndex: parsed.index, checked });\n return updatedBody;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport {\n issueCriteriaToTodos,\n mergeIssueTodos,\n syncTodoCompletion,\n} from \"../utils/issue-todo-sync.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"todo-hooks\");\n\nexport interface TodoSyncPaths {\n issueNumber: number;\n}\n\nexport interface IssueLoadedResult {\n mergedTodos: OpenCodeTodo[];\n newIssueTodos: OpenCodeTodo[];\n}\n\nexport async function onIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber: number,\n issueBody: string | null\n): Promise<IssueLoadedResult> {\n if (!config.features.todoSync) {\n return { mergedTodos: [], newIssueTodos: [] };\n }\n\n const newIssueTodos = issueCriteriaToTodos(issueNumber, issueBody);\n const existingTodos = tracker.getCurrentTodos() || [];\n const mergedTodos = mergeIssueTodos(existingTodos, newIssueTodos);\n\n await tracker.setCurrentTodos(mergedTodos);\n\n log.info(\"Synced issue acceptance criteria to todos\", {\n issueNumber,\n newTodos: newIssueTodos.length,\n totalTodos: mergedTodos.length,\n });\n\n return { mergedTodos, newIssueTodos };\n}\n\nexport async function onTodoWritten(\n tracker: IssueTracker,\n config: SdlcConfig,\n _paths: TodoSyncPaths,\n todos: OpenCodeTodo[]\n): Promise<string | null> {\n if (!config.features.todoSync) {\n return null;\n }\n\n const previousTodos = tracker.getCurrentTodos() || [];\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return null;\n }\n\n let updatedBody: string | null = null;\n\n for (const todo of todos) {\n const updated = await syncTodoCompletion(\n currentIssue.issueNumber,\n todo,\n previousTodos,\n currentIssue.body ?? \"\"\n );\n if (updated) {\n updatedBody = updated;\n }\n }\n\n if (updatedBody) {\n await tracker.updateIssueBody(updatedBody);\n log.info(\"Issue todos updated\", { issueNumber: currentIssue.issueNumber });\n }\n\n await tracker.setCurrentTodos(todos);\n return updatedBody;\n}\n","/**\n * Tool execution hooks\n *\n * Implements safety net warnings for git operations and issue todo synchronization.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { updateIssueBody } from \"../utils/github-issues.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { createOrchestratorGuard, formatGuardError } from \"./orchestrator-guard.js\";\nimport { onIssueLoaded, onTodoWritten } from \"./todo-hooks.js\";\n\nconst log = createPluginLogger(\"tool-hooks\");\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\ninterface AfterHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface AfterHookOutput {\n title: string;\n output: string;\n metadata: unknown;\n}\n\n/**\n * Git write operations that modify repository state.\n * These require explicit user permission when autoGitOperations is disabled.\n */\nconst GIT_WRITE_COMMANDS = [\n // Standard git commands\n \"git commit\",\n \"git push\",\n \"git checkout -b\",\n \"git branch\",\n \"git switch -c\",\n \"git switch --create\",\n \"git merge\",\n \"git rebase\",\n \"git cherry-pick\",\n \"git stash\",\n \"git tag\",\n \"git reset\",\n // Git-spice commands (stacked PRs workflow)\n \"gs branch create\",\n \"gs commit create\",\n \"gs stack submit\",\n \"gs restack\",\n \"gs branch delete\",\n \"gs up\",\n \"gs down\",\n // GitHub CLI commands\n \"gh pr create\",\n \"gh pr edit\",\n \"gh pr merge\",\n \"gh pr close\",\n \"gh pr review\",\n \"gh issue create\",\n \"gh issue edit\",\n \"gh issue close\",\n \"gh release create\",\n \"gh release edit\",\n \"gh release delete\",\n];\n\nfunction getBashCommand(metadata: unknown): string {\n if (!metadata || typeof metadata !== \"object\") {\n return \"\";\n }\n\n const cmd = (metadata as Record<string, unknown>).command;\n return typeof cmd === \"string\" ? cmd : \"\";\n}\n\nfunction containsGitWriteCommand(command: string): boolean {\n const normalized = command.trim().toLowerCase();\n\n // Split by common shell separators to check each command segment\n // This prevents false positives from strings like: echo \"git commit\"\n const segments = normalized.split(/[;&|]+/).map((s) => s.trim());\n\n return segments.some((segment) =>\n GIT_WRITE_COMMANDS.some((gitCmd) => segment.startsWith(gitCmd.toLowerCase()))\n );\n}\n\nexport function createToolHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n // Create orchestrator guard for blocking file writes from main context\n const orchestratorGuard = createOrchestratorGuard(config);\n\n return {\n before: async (input: BeforeHookInput, output: BeforeHookOutput): Promise<void> => {\n // Check orchestrator guard for file write operations\n const guardResult = orchestratorGuard.check(input, output);\n\n if (!guardResult.allowed) {\n // Throw an error to block the operation\n // The error message will be shown to the agent\n throw new Error(formatGuardError(guardResult));\n }\n },\n\n after: async (input: AfterHookInput, output: AfterHookOutput): Promise<void> => {\n // Check for autoGitOperations in legacy features, default to false for new features\n const autoGitOperations =\n \"autoGitOperations\" in config.features\n ? (config.features as import(\"../../shared/types.js\").LegacyFeatures).autoGitOperations\n : false;\n\n if (!autoGitOperations && input.tool === \"bash\") {\n const command = getBashCommand(output.metadata);\n\n if (containsGitWriteCommand(command)) {\n log.warn(\"Git write operation detected\", { command: command.slice(0, 100) });\n output.output +=\n \"\\n\\n⚠️ SDLC GIT OPERATIONS POLICY REMINDER:\\n\" +\n \"Git operations should only be performed when explicitly requested by the user.\\n\" +\n \"If this command was run automatically (not requested by the user), please:\\n\" +\n \"1. Ask the user before proceeding with further git operations\\n\" +\n \"2. Use sdlc_update_issue_status() to track issue progress instead of git commits\\n\" +\n \"\\n\" +\n \"To enable automatic git operations, set features.autoGitOperations=true in sdlc.json (legacy)\\n\" +\n \"or configure git.workflow in sdlc.json (v0.3.0+)\";\n }\n }\n\n // Check for todoSync in both old and new features\n const todoSyncEnabled = config.features.todoSync;\n\n if (input.tool === \"sdlc_get_issue\" && todoSyncEnabled) {\n await handleIssueLoaded(tracker, config, output);\n }\n\n if (input.tool === \"todowrite\" && todoSyncEnabled) {\n await handleTodoWritten(ctx, tracker, config, output);\n }\n },\n };\n}\n\nasync function handleIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n try {\n const result = JSON.parse(output.output);\n if (!result.issueNumber || !result.body) {\n log.debug(\"Issue load response missing issueNumber or body\");\n return;\n }\n\n log.debug(\"Processing issue load for todo sync\", { issueNumber: result.issueNumber });\n\n const { newIssueTodos, mergedTodos } = await onIssueLoaded(\n tracker,\n config,\n result.issueNumber,\n result.body\n );\n\n if (newIssueTodos.length > 0) {\n result.todos = {\n hint: \"Call todowrite with these todos to populate your task list. Marking todos complete updates GitHub issue checkboxes automatically.\",\n items: newIssueTodos,\n };\n output.output = JSON.stringify(result, null, 2);\n\n log.debug(\"Injected issue todos into response\", {\n issueNumber: result.issueNumber,\n newTodos: newIssueTodos.length,\n totalTracked: mergedTodos.length,\n });\n } else {\n log.debug(\"No acceptance criteria todos found\", { issueNumber: result.issueNumber });\n }\n } catch (error) {\n log.warn(\"Failed to process issue for todo sync\", { error: String(error) });\n }\n}\n\nasync function handleTodoWritten(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n const todos = extractTodosFromOutput(output);\n\n if (!todos || todos.length === 0) {\n log.debug(\"No todos found in todowrite output\");\n return;\n }\n\n try {\n const currentIssue = tracker.getCurrentIssue();\n if (!currentIssue) {\n return;\n }\n const updatedBody = await onTodoWritten(\n tracker,\n config,\n { issueNumber: currentIssue.issueNumber },\n todos\n );\n if (updatedBody) {\n await updateIssueBody(ctx, config, currentIssue.issueNumber, updatedBody);\n }\n } catch (error) {\n log.warn(\"Error processing todowrite for issue sync\", { error: String(error) });\n }\n}\n\nfunction extractTodosFromOutput(output: AfterHookOutput): OpenCodeTodo[] | null {\n const metadata = output.metadata as Record<string, unknown> | undefined;\n if (metadata?.todos && Array.isArray(metadata.todos)) {\n log.debug(\"Extracted todos from metadata\", { count: metadata.todos.length });\n return metadata.todos as OpenCodeTodo[];\n }\n\n try {\n const result = JSON.parse(output.output);\n if (Array.isArray(result)) {\n log.debug(\"Extracted todos from output (array)\", { count: result.length });\n return result as OpenCodeTodo[];\n }\n if (result?.todos && Array.isArray(result.todos)) {\n log.debug(\"Extracted todos from output.todos\", { count: result.todos.length });\n return result.todos as OpenCodeTodo[];\n }\n } catch {\n log.debug(\"Could not parse output as JSON\");\n }\n\n return null;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { isIssueTodo } from \"../utils/issue-todo-sync.js\";\n\ninterface CompactionInput {\n sessionID: string;\n}\n\ninterface CompactionOutput {\n context: string[];\n}\n\nconst PRIORITY_ORDER: Record<string, number> = { high: 0, medium: 1, low: 2 };\n\nexport function createCompactionHook(tracker: IssueTracker, config: SdlcConfig) {\n void config;\n return async (_input: CompactionInput, output: CompactionOutput): Promise<void> => {\n const issueContext = await tracker.getCurrentIssueContext();\n const todos = tracker.getCurrentTodos();\n const currentIssue = tracker.getCurrentIssue();\n\n const parts: string[] = [];\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pending = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"pending\");\n const inProgress = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"in_progress\");\n\n if (issueTodos.length > 0 && (pending.length > 0 || inProgress.length > 0)) {\n parts.push(\"## ⚠️ MANDATORY POST-COMPACTION PROTOCOL\");\n parts.push(\"\");\n parts.push(\"**STOP. Before doing ANYTHING else:**\");\n parts.push(\"1. Call `todoread` to get your current task list\");\n parts.push(\"2. Review the todos below and compare to any 'next steps' you see\");\n parts.push(\"3. If any todo is marked `in_progress`, complete it FIRST\");\n parts.push(\"4. The TODO LIST is your source of truth, not the compaction summary\");\n parts.push(\"\");\n\n if (inProgress.length > 0) {\n parts.push(\"### 🔄 IN PROGRESS (Complete these FIRST):\");\n for (const todo of inProgress) {\n parts.push(`- ${todo.content}`);\n }\n parts.push(\"\");\n }\n\n if (pending.length > 0) {\n parts.push(\"### ⏳ PENDING (Work queue):\");\n const sortedPending = pending.sort(\n (a: OpenCodeTodo, b: OpenCodeTodo) =>\n (PRIORITY_ORDER[a.priority] ?? 99) - (PRIORITY_ORDER[b.priority] ?? 99)\n );\n\n const todosToShow = sortedPending.slice(0, 10);\n for (const todo of todosToShow) {\n parts.push(`- ${todo.content}`);\n }\n\n if (pending.length > 10) {\n parts.push(` ... and ${pending.length - 10} more (call todoread for full list)`);\n }\n parts.push(\"\");\n }\n\n parts.push(\"### ✅ VERIFICATION REQUIRED\");\n parts.push(\"Call `todoread` NOW to confirm this matches your working state.\");\n parts.push(\n \"If it doesn't match, the todo list takes priority over any 'next steps' in this summary.\"\n );\n parts.push(\"\");\n parts.push(\"---\");\n parts.push(\"\");\n }\n }\n\n if (issueContext) {\n parts.push(\"## OpenCode SDLC - Current Issue Context\");\n parts.push(\"\");\n parts.push(issueContext);\n if (currentIssue) {\n parts.push(`**Issue:** #${currentIssue.issueNumber}`);\n }\n parts.push(\"\");\n }\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pendingCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"pending\"\n ).length;\n const inProgressCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"in_progress\"\n ).length;\n const completedCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"completed\"\n ).length;\n\n if (issueTodos.length > 0) {\n parts.push(\"## Todo Sync (Issues ↔ Todos)\");\n parts.push(\"\");\n parts.push(`**Progress:** ${completedCount}/${issueTodos.length} issue tasks complete`);\n parts.push(`**Remaining:** ${pendingCount} pending, ${inProgressCount} in progress`);\n parts.push(\"\");\n parts.push(\"**How todos work:**\");\n parts.push(\"- Format: `[#<issueNumber>ΔAC1] {task}`\");\n parts.push(\"- Marking a todo complete updates the issue checkbox automatically\");\n parts.push(\"- For task details, open the GitHub issue\");\n parts.push(\"\");\n if (currentIssue) {\n parts.push(\"**To look up task context:**\");\n parts.push(\"```\");\n parts.push(`sdlc_get_issue(${currentIssue.issueNumber})`);\n parts.push(\"```\");\n parts.push(\"\");\n }\n }\n }\n\n if (issueContext || (todos && todos.length > 0)) {\n parts.push(\n \"IMPORTANT: You are implementing a GitHub issue. Use sdlc_get_issue to reload full context if needed. Use sdlc_update_issue_status to update the issue status when complete.\"\n );\n parts.push(\"\");\n\n output.context.push(parts.join(\"\\n\"));\n }\n };\n}\n","/**\n * TDD Cycle State Tracker\n *\n * Tracks the state of the TDD cycle: RED → DOMAIN → GREEN → DOMAIN\n * Ensures the cycle is followed correctly and provides state persistence.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { TddPhase } from \"../utils/tdd-file-ownership.js\";\n\n/**\n * Valid transitions in the TDD cycle\n */\nexport const VALID_TRANSITIONS: Record<TddPhase | \"initial\", TddPhase[]> = {\n initial: [\"red\"], // Can only start with RED\n red: [\"domain\"], // RED must be followed by DOMAIN\n domain: [\"green\", \"red\"], // DOMAIN can go to GREEN or back to RED (if veto)\n green: [\"domain\"], // GREEN must be followed by DOMAIN\n};\n\n/**\n * TDD cycle states\n */\nexport type CycleState =\n | \"idle\" // No active TDD cycle\n | \"red_in_progress\" // Writing a failing test\n | \"red_complete\" // Test written and fails\n | \"domain_review_red\" // Domain review after RED\n | \"domain_approved_red\" // Domain approved after RED\n | \"domain_vetoed\" // Domain vetoed, must fix\n | \"green_in_progress\" // Writing implementation\n | \"green_complete\" // Implementation written, test passes\n | \"domain_review_green\" // Domain review after GREEN\n | \"domain_approved_green\" // Domain approved after GREEN, cycle complete\n | \"cycle_complete\"; // Full cycle complete, ready for next\n\n/**\n * A single cycle entry with timestamps and proof\n */\nexport interface CycleEntry {\n phase: TddPhase;\n state: CycleState;\n timestamp: string;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n implementationFiles?: string[];\n typesCreated?: string[];\n domainApproved?: boolean;\n vetoReason?: string;\n proof?: string;\n}\n\n/**\n * Persisted TDD cycle state\n */\nexport interface TddCycleState {\n /** Current issue being worked on */\n currentIssue: number | null;\n /** Current acceptance criterion */\n currentAC?: string;\n /** Session ID */\n sessionId: string;\n /** Project directory */\n projectDir: string;\n /** Current state in the cycle */\n currentState: CycleState;\n /** Current phase */\n currentPhase: TddPhase | null;\n /** Cycle history for current issue */\n cycleHistory: CycleEntry[];\n /** Number of completed RED-GREEN cycles */\n cyclesCompleted: number;\n /** Last RED phase output (for GREEN phase reference) */\n lastRedOutput?: {\n testName: string;\n testFile: string;\n failureMessage: string;\n };\n /** Last DOMAIN phase output */\n lastDomainOutput?: {\n approved: boolean;\n typesCreated: string[];\n vetoReason?: string;\n };\n}\n\n/**\n * Default state path\n */\nconst DEFAULT_STATE_PATH = join(\n process.env.HOME || \"~\",\n \".config\",\n \"opencode\",\n \"sdlc-tdd-state.json\"\n);\n\n/**\n * TDD Cycle Tracker class\n */\nexport class TddCycleTracker {\n private state: TddCycleState;\n private statePath: string;\n\n constructor(projectDir: string, sessionId: string, statePath?: string) {\n this.statePath = statePath ?? DEFAULT_STATE_PATH;\n this.state = this.loadState(projectDir, sessionId);\n }\n\n /**\n * Load state from disk or create new state\n */\n private loadState(projectDir: string, sessionId: string): TddCycleState {\n try {\n if (existsSync(this.statePath)) {\n const data = JSON.parse(readFileSync(this.statePath, \"utf-8\")) as TddCycleState;\n\n // If same session and project, return existing state\n if (data.sessionId === sessionId && data.projectDir === projectDir) {\n return data;\n }\n\n // Different session/project, reset state but preserve some history\n return {\n currentIssue: null,\n sessionId,\n projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n }\n } catch {\n // Ignore load errors, create new state\n }\n\n return {\n currentIssue: null,\n sessionId,\n projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n }\n\n /**\n * Save state to disk\n */\n private saveState(): void {\n try {\n const dir = dirname(this.statePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.statePath, JSON.stringify(this.state, null, 2));\n } catch (error) {\n console.error(\"Failed to save TDD cycle state:\", error);\n }\n }\n\n /**\n * Get current state\n */\n getState(): TddCycleState {\n return { ...this.state };\n }\n\n /**\n * Start working on an issue\n */\n startIssue(issueNumber: number, acceptanceCriterion?: string): void {\n this.state.currentIssue = issueNumber;\n this.state.currentAC = acceptanceCriterion;\n this.state.currentState = \"idle\";\n this.state.currentPhase = null;\n this.state.cycleHistory = [];\n this.state.cyclesCompleted = 0;\n this.state.lastRedOutput = undefined;\n this.state.lastDomainOutput = undefined;\n this.saveState();\n }\n\n /**\n * Check if a transition to a phase is valid\n */\n canTransitionTo(phase: TddPhase): { valid: boolean; reason: string } {\n const currentPhaseOrInitial = this.state.currentPhase ?? \"initial\";\n const validNextPhases = VALID_TRANSITIONS[currentPhaseOrInitial];\n\n if (validNextPhases.includes(phase)) {\n return {\n valid: true,\n reason: `Transition from ${currentPhaseOrInitial} to ${phase} is valid`,\n };\n }\n\n return {\n valid: false,\n reason: `Invalid transition: Cannot go from ${currentPhaseOrInitial} to ${phase}. Valid next phases: ${validNextPhases.join(\", \")}`,\n };\n }\n\n /**\n * Start RED phase\n */\n startRed(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"red\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n this.state.currentPhase = \"red\";\n this.state.currentState = \"red_in_progress\";\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete RED phase\n */\n completeRed(\n testName: string,\n testFile: string,\n failureMessage: string\n ): { success: boolean; error?: string } {\n if (this.state.currentState !== \"red_in_progress\") {\n return { success: false, error: \"RED phase not in progress\" };\n }\n\n this.state.currentState = \"red_complete\";\n this.state.lastRedOutput = { testName, testFile, failureMessage };\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_complete\",\n timestamp: new Date().toISOString(),\n testName,\n testFile,\n failureMessage,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start DOMAIN review phase\n */\n startDomain(context: \"red\" | \"green\"): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"domain\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n const expectedPreviousState = context === \"red\" ? \"red_complete\" : \"green_complete\";\n if (\n this.state.currentState !== expectedPreviousState &&\n this.state.currentState !== \"domain_vetoed\"\n ) {\n return {\n success: false,\n error: `Cannot start DOMAIN review: expected state ${expectedPreviousState}, got ${this.state.currentState}`,\n };\n }\n\n this.state.currentPhase = \"domain\";\n this.state.currentState = context === \"red\" ? \"domain_review_red\" : \"domain_review_green\";\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with approval\n */\n approveDomain(typesCreated: string[] = []): { success: boolean; error?: string } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n const wasReviewingRed = this.state.currentState === \"domain_review_red\";\n this.state.currentState = wasReviewingRed ? \"domain_approved_red\" : \"domain_approved_green\";\n this.state.lastDomainOutput = { approved: true, typesCreated };\n\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n domainApproved: true,\n typesCreated,\n });\n\n if (!wasReviewingRed) {\n // Cycle complete after GREEN + DOMAIN approval\n this.state.currentState = \"cycle_complete\";\n this.state.cyclesCompleted++;\n this.state.currentPhase = null;\n }\n\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with veto\n */\n vetoDomain(reason: string): { success: boolean; error?: string } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n this.state.currentState = \"domain_vetoed\";\n this.state.lastDomainOutput = { approved: false, typesCreated: [], vetoReason: reason };\n this.addCycleEntry({\n phase: \"domain\",\n state: \"domain_vetoed\",\n timestamp: new Date().toISOString(),\n domainApproved: false,\n vetoReason: reason,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start GREEN phase\n */\n startGreen(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"green\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n if (this.state.currentState !== \"domain_approved_red\") {\n return {\n success: false,\n error: `Cannot start GREEN phase: DOMAIN approval required. Current state: ${this.state.currentState}`,\n };\n }\n\n if (!this.state.lastRedOutput) {\n return { success: false, error: \"Cannot start GREEN phase: No RED phase output available\" };\n }\n\n this.state.currentPhase = \"green\";\n this.state.currentState = \"green_in_progress\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete GREEN phase\n */\n completeGreen(implementationFiles: string[]): { success: boolean; error?: string } {\n if (this.state.currentState !== \"green_in_progress\") {\n return { success: false, error: \"GREEN phase not in progress\" };\n }\n\n this.state.currentState = \"green_complete\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_complete\",\n timestamp: new Date().toISOString(),\n implementationFiles,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Add an entry to cycle history\n */\n private addCycleEntry(entry: CycleEntry): void {\n this.state.cycleHistory.push(entry);\n }\n\n /**\n * Get summary of current cycle progress\n */\n getCycleSummary(): string {\n const { currentState, currentPhase, cyclesCompleted, lastRedOutput, lastDomainOutput } =\n this.state;\n\n let summary = \"TDD Cycle Status:\\n\";\n summary += ` Cycles completed: ${cyclesCompleted}\\n`;\n summary += ` Current state: ${currentState}\\n`;\n summary += ` Current phase: ${currentPhase ?? \"none\"}\\n`;\n\n if (lastRedOutput) {\n summary += \"\\n Last RED output:\\n\";\n summary += ` Test: ${lastRedOutput.testName}\\n`;\n summary += ` File: ${lastRedOutput.testFile}\\n`;\n }\n\n if (lastDomainOutput) {\n summary += \"\\n Last DOMAIN output:\\n\";\n summary += ` Approved: ${lastDomainOutput.approved}\\n`;\n if (lastDomainOutput.typesCreated.length > 0) {\n summary += ` Types created: ${lastDomainOutput.typesCreated.join(\", \")}\\n`;\n }\n if (lastDomainOutput.vetoReason) {\n summary += ` Veto reason: ${lastDomainOutput.vetoReason}\\n`;\n }\n }\n\n return summary;\n }\n\n /**\n * Reset the tracker\n */\n reset(): void {\n this.state = {\n currentIssue: null,\n sessionId: this.state.sessionId,\n projectDir: this.state.projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n this.saveState();\n }\n\n /**\n * Get the last RED output (for GREEN phase)\n */\n getLastRedOutput(): TddCycleState[\"lastRedOutput\"] {\n return this.state.lastRedOutput;\n }\n\n /**\n * Get the last DOMAIN output\n */\n getLastDomainOutput(): TddCycleState[\"lastDomainOutput\"] {\n return this.state.lastDomainOutput;\n }\n}\n","/**\n * sdlc_adr Tool\n *\n * Architecture Decision Record (ADR) management:\n * - Create new ADRs in docs/adr/\n * - List existing ADRs\n * - Synthesize accepted ADRs into ARCHITECTURE.md\n */\n\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * ADR status\n */\nexport type AdrStatus = \"proposed\" | \"accepted\" | \"deprecated\" | \"superseded\";\n\n/**\n * ADR metadata\n */\nexport interface AdrMetadata {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n deciders?: string[];\n supersedes?: number;\n supersededBy?: number;\n}\n\n/**\n * ADR list item\n */\nexport interface AdrListItem extends AdrMetadata {\n path: string;\n}\n\n/**\n * ADR creation result\n */\nexport interface AdrCreateResult {\n success: boolean;\n path?: string;\n number?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR list result\n */\nexport interface AdrListResult {\n success: boolean;\n adrs?: AdrListItem[];\n count?: number;\n error?: string;\n}\n\n/**\n * ADR synthesize result\n */\nexport interface AdrSynthesizeResult {\n success: boolean;\n architecturePath?: string;\n includedAdrs?: number[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR tool result (union of all results)\n */\nexport type AdrResult = AdrCreateResult | AdrListResult | AdrSynthesizeResult;\n\n/**\n * Arguments for sdlc_adr tool\n */\nexport interface AdrArgs {\n action: \"create\" | \"list\" | \"synthesize\";\n title?: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\n/**\n * Create the sdlc_adr tool\n */\nexport function createAdrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Manage Architecture Decision Records (ADRs).\n\nActions:\n- create: Create a new ADR with title, context, decision, and consequences\n- list: List all existing ADRs with their status\n- synthesize: Generate/update ARCHITECTURE.md from accepted ADRs\n\nADRs are stored in docs/adr/ following the standard ADR format.\nNumbers are auto-assigned sequentially.\n\nCreate returns the path to the new ADR.\nList returns metadata for all ADRs.\nSynthesize updates ARCHITECTURE.md with current decisions.`,\n\n args: {\n action: tool.schema\n .enum([\"create\", \"list\", \"synthesize\"])\n .describe(\"Action to perform: create, list, or synthesize\"),\n title: tool.schema\n .string()\n .optional()\n .describe(\"Title for new ADR (required for create action)\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Context/background for the decision (for create action)\"),\n decision: tool.schema\n .string()\n .optional()\n .describe(\"The decision being made (for create action)\"),\n consequences: tool.schema\n .string()\n .optional()\n .describe(\"Consequences of the decision (for create action)\"),\n },\n\n async execute(args): Promise<string> {\n const adrArgs = args as AdrArgs;\n\n switch (adrArgs.action) {\n case \"create\":\n return JSON.stringify(await createAdr(ctx, config, adrArgs), null, 2);\n case \"list\":\n return JSON.stringify(await listAdrs(ctx), null, 2);\n case \"synthesize\":\n return JSON.stringify(await synthesizeAdrs(ctx, config), null, 2);\n default:\n return JSON.stringify({\n success: false,\n error: `Unknown action: ${adrArgs.action}`,\n });\n }\n },\n });\n}\n\nconst ADR_DIR = \"docs/adr\";\n\nasync function createAdr(\n ctx: PluginInput,\n _config: SdlcConfig,\n args: AdrArgs\n): Promise<AdrCreateResult> {\n if (!args.title) {\n return {\n success: false,\n error: \"Title is required for creating an ADR\",\n suggestion: \"Provide a title describing the architectural decision\",\n };\n }\n\n const adrDir = join(ctx.directory, ADR_DIR);\n\n // Ensure directory exists\n try {\n await mkdir(adrDir, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Get next ADR number\n const existingAdrs = await getExistingAdrNumbers(adrDir);\n const nextNumber = existingAdrs.length > 0 ? Math.max(...existingAdrs) + 1 : 1;\n\n // Format number with leading zeros (e.g., 0001)\n const paddedNumber = String(nextNumber).padStart(4, \"0\");\n const slug = slugify(args.title);\n const filename = `${paddedNumber}-${slug}.md`;\n const filePath = join(adrDir, filename);\n\n // Generate ADR content\n const date = new Date().toISOString().split(\"T\")[0];\n const content = generateAdrContent({\n number: nextNumber,\n title: args.title,\n status: \"proposed\",\n date,\n context: args.context,\n decision: args.decision,\n consequences: args.consequences,\n });\n\n try {\n await writeFile(filePath, content, \"utf-8\");\n\n return {\n success: true,\n path: filePath,\n number: nextNumber,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to create ADR: ${message}`,\n suggestion: \"Check file system permissions\",\n };\n }\n}\n\nasync function listAdrs(ctx: PluginInput): Promise<AdrListResult> {\n const adrDir = join(ctx.directory, ADR_DIR);\n\n try {\n const files = await readdir(adrDir);\n const adrFiles = files.filter((f) => f.match(/^\\d{4}-.*\\.md$/));\n\n const adrs: AdrListItem[] = [];\n\n for (const file of adrFiles) {\n const filePath = join(adrDir, file);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const metadata = parseAdrMetadata(content, file);\n adrs.push({\n ...metadata,\n path: filePath,\n });\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Sort by number\n adrs.sort((a, b) => a.number - b.number);\n\n return {\n success: true,\n adrs,\n count: adrs.length,\n };\n } catch {\n return {\n success: true,\n adrs: [],\n count: 0,\n };\n }\n}\n\nasync function synthesizeAdrs(ctx: PluginInput, config: SdlcConfig): Promise<AdrSynthesizeResult> {\n // Get all accepted ADRs\n const listResult = await listAdrs(ctx);\n\n if (!listResult.success || !listResult.adrs) {\n return {\n success: false,\n error: \"Failed to list ADRs\",\n };\n }\n\n const acceptedAdrs = listResult.adrs.filter((adr) => adr.status === \"accepted\");\n\n if (acceptedAdrs.length === 0) {\n return {\n success: false,\n error: \"No accepted ADRs found\",\n suggestion: \"Mark ADRs as accepted by changing their status in the file\",\n };\n }\n\n // Spawn agent to synthesize\n const synthesizeResult = await spawnSynthesizeAgent(ctx, config, acceptedAdrs);\n\n if (!synthesizeResult.success) {\n return {\n success: false,\n error: synthesizeResult.error || \"Synthesis failed\",\n suggestion: \"Check agent configuration\",\n };\n }\n\n // Write ARCHITECTURE.md\n const architecturePath = join(ctx.directory, \"ARCHITECTURE.md\");\n\n try {\n await writeFile(architecturePath, synthesizeResult.content || \"\", \"utf-8\");\n\n return {\n success: true,\n architecturePath,\n includedAdrs: acceptedAdrs.map((a) => a.number),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write ARCHITECTURE.md: ${message}`,\n };\n }\n}\n\nasync function getExistingAdrNumbers(adrDir: string): Promise<number[]> {\n try {\n const files = await readdir(adrDir);\n const numbers: number[] = [];\n\n for (const file of files) {\n const match = file.match(/^(\\d{4})-/);\n if (match) {\n numbers.push(Number.parseInt(match[1], 10));\n }\n }\n\n return numbers;\n } catch {\n return [];\n }\n}\n\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 50);\n}\n\ninterface AdrContentArgs {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\nfunction generateAdrContent(args: AdrContentArgs): string {\n return `# ADR ${args.number}: ${args.title}\n\n## Status\n\n${args.status.charAt(0).toUpperCase() + args.status.slice(1)}\n\n## Date\n\n${args.date}\n\n## Context\n\n${args.context || \"<!-- Describe the context and problem statement -->\"}\n\n## Decision\n\n${args.decision || \"<!-- Describe the decision that was made -->\"}\n\n## Consequences\n\n${args.consequences || \"<!-- Describe the consequences of this decision -->\"}\n\n### Positive\n\n- <!-- List positive consequences -->\n\n### Negative\n\n- <!-- List negative consequences or trade-offs -->\n\n### Neutral\n\n- <!-- List neutral observations -->\n\n## References\n\n- <!-- Add links to related documents, issues, or discussions -->\n`;\n}\n\nfunction parseAdrMetadata(content: string, filename: string): AdrMetadata {\n // Extract number from filename\n const numberMatch = filename.match(/^(\\d{4})-/);\n const number = numberMatch ? Number.parseInt(numberMatch[1], 10) : 0;\n\n // Extract title from first heading\n const titleMatch = content.match(/^#\\s+ADR\\s+\\d+:\\s*(.+)$/m);\n const title = titleMatch ? titleMatch[1].trim() : filename.replace(/^\\d{4}-|\\.md$/g, \"\");\n\n // Extract status\n const statusMatch = content.match(/##\\s*Status\\s*\\n+(\\w+)/i);\n const statusStr = statusMatch ? statusMatch[1].toLowerCase() : \"proposed\";\n const status: AdrStatus =\n statusStr === \"accepted\" ||\n statusStr === \"deprecated\" ||\n statusStr === \"superseded\" ||\n statusStr === \"proposed\"\n ? statusStr\n : \"proposed\";\n\n // Extract date\n const dateMatch = content.match(/##\\s*Date\\s*\\n+(\\d{4}-\\d{2}-\\d{2})/i);\n const date = dateMatch ? dateMatch[1] : new Date().toISOString().split(\"T\")[0];\n\n // Extract supersedes/supersededBy\n const supersedesMatch = content.match(/Supersedes\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n const supersededByMatch = content.match(/Superseded\\s*by\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n\n return {\n number,\n title,\n status,\n date,\n supersedes: supersedesMatch ? Number.parseInt(supersedesMatch[1], 10) : undefined,\n supersededBy: supersededByMatch ? Number.parseInt(supersededByMatch[1], 10) : undefined,\n };\n}\n\ninterface SynthesizeAgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnSynthesizeAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n adrs: AdrListItem[]\n): Promise<SynthesizeAgentResult> {\n try {\n // Build prompt with ADR contents\n let adrContents = \"\";\n for (const adr of adrs) {\n try {\n const content = await readFile(adr.path, \"utf-8\");\n adrContents += `\\n\\n---\\n\\n## ADR ${adr.number}: ${adr.title}\\n\\n${content}`;\n } catch {\n // Skip unreadable ADRs\n }\n }\n\n const prompt = `# Synthesize Architecture Documentation\n\nYou are tasked with creating an ARCHITECTURE.md file that synthesizes the accepted Architecture Decision Records (ADRs) into a cohesive architectural overview.\n\n## Instructions\n\n1. Read through all the ADRs provided below\n2. Extract the key architectural decisions and their rationale\n3. Organize them into a coherent ARCHITECTURE.md document with sections:\n - Overview (high-level system architecture)\n - Key Decisions (summarized from ADRs)\n - Components (if applicable)\n - Data Flow (if applicable)\n - Technology Choices (summarized from ADRs)\n - Trade-offs and Constraints\n\n4. Reference the original ADR numbers so readers can find detailed context\n5. Keep the document concise but comprehensive\n\n## Accepted ADRs\n\n${adrContents}\n\n## Output\n\nGenerate the complete ARCHITECTURE.md content. Start directly with the markdown content.`;\n\n const createResult = await ctx.client.session.create({\n body: {\n title: \"ADR Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create synthesis session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from synthesis agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in synthesis session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Synthesis failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n createAdr,\n listAdrs,\n synthesizeAdrs,\n parseAdrMetadata,\n generateAdrContent,\n slugify,\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Get version from package.json at runtime.\n * Handles both bundled (dist/) and development (src/) scenarios.\n */\nfunction getPackageVersion(): string {\n try {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n const possiblePaths = [\n join(currentDir, \"..\", \"..\", \"package.json\"),\n join(currentDir, \"..\", \"..\", \"..\", \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n if (!existsSync(pkgPath)) continue;\n\n const content = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.version) return pkg.version;\n }\n\n return \"0.0.0\";\n } catch (error) {\n if (error instanceof SyntaxError) {\n console.error(\"[opencode-sdlc] Warning: package.json contains invalid JSON\");\n }\n return \"0.0.0\";\n }\n}\n\n/**\n * Current version of OpenCode SDLC Plugin\n * Dynamically read from package.json\n */\nexport const VERSION = getPackageVersion();\n\n/**\n * Package name for CLI display\n */\nexport const PACKAGE_NAME = \"opencode-sdlc-plugin\";\n\n/**\n * CLI display name\n */\nexport const DISPLAY_NAME = \"OpenCode SDLC\";\n\n/**\n * Tagline for CLI header\n */\nexport const TAGLINE = \"Strict TDD with domain modeling and event sourcing\";\n\n/**\n * Configuration paths\n */\nexport const CONFIG_PATHS = {\n /** Global OpenCode config directory */\n globalConfigDir: join(homedir(), \".config\", \"opencode\"),\n\n /** Global SDLC config file */\n globalSdlcConfig: join(homedir(), \".config\", \"opencode\", \"sdlc.json\"),\n\n /** Global OpenCode config file */\n globalOpencodeConfig: join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\n /** Global oh-my-opencode config file */\n globalOmoConfig: join(homedir(), \".config\", \"opencode\", \"oh-my-opencode.json\"),\n\n /** Commands directory */\n commandsDir: join(homedir(), \".config\", \"opencode\", \"command\"),\n\n /** Plugin directory */\n pluginDir: join(homedir(), \".config\", \"opencode\", \"plugin\"),\n\n /** SDLC internal files directory (state, backups) */\n sdlcDir: join(homedir(), \".config\", \"opencode\", \"sdlc\"),\n\n /** SDLC backups directory */\n backupsDir: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"backups\"),\n\n /** SDLC state file (for issue tracking) */\n stateFile: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"sdlc-state.json\"),\n\n /** Legacy state file path (for migration) */\n legacyStateFile: join(homedir(), \".config\", \"opencode\", \"sdlc-state.json\"),\n} as const;\n\n/**\n * Project-specific paths (relative to project root)\n */\nexport const PROJECT_PATHS = {\n /** Local SDLC config */\n localConfig: \".opencode/sdlc.json\",\n} as const;\n\n/**\n * Default configuration values (v0.3.0+)\n */\nexport const DEFAULTS = {\n // ============================================================================\n // New v0.3.0+ defaults\n // ============================================================================\n\n /** Default TDD configuration */\n tdd: {\n enabled: true,\n verbosity: \"brief\" as const,\n bypassPatterns: [\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"],\n mutationTesting: {\n enabled: false,\n requiredScore: 80,\n },\n },\n\n /** Default Event Modeling configuration */\n eventModeling: {\n enabled: false,\n outputPath: \"docs/event-model\",\n },\n\n /** Default Git configuration */\n git: {\n workflow: \"standard\" as const,\n requireClean: true,\n worktrees: false,\n },\n\n /** Default features enabled (v0.3.0+) */\n features: {\n orchestratorOnly: false,\n todoSync: true,\n partyReview: true,\n debuggingProtocol: true,\n memento: false,\n notifications: true,\n lspTools: true,\n },\n\n /** Default MCPs enabled (v0.3.0+) */\n mcps: {\n context7: true,\n exa: true,\n grepApp: true,\n memento: false,\n },\n} as const;\n\n/**\n * Minimum compatible versions\n */\nexport const MIN_VERSIONS = {\n node: \"20.0.0\",\n opencode: \"1.0.132\",\n} as const;\n","/**\n * sdlc_config tool\n *\n * View current Sdlc configuration.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Create the sdlc_config tool\n */\nexport function createConfigTool(config: SdlcConfig): ToolDefinition {\n return tool({\n description: `View the current OpenCode SDLC configuration.\n\nShows:\n- Version information\n- Subscription settings (Claude, OpenAI, Google)\n- Model assignments for each agent role\n- BMAD integration settings\n- Enabled features and MCP servers`,\n\n args: {\n section: tool.schema\n .enum([\"all\", \"subscriptions\", \"models\", \"bmad\", \"features\", \"mcps\"])\n .optional()\n .describe(\"Specific section to view (default: all)\"),\n },\n\n async execute(args): Promise<string> {\n const section = args.section || \"all\";\n\n if (section === \"all\") {\n return JSON.stringify(\n {\n sdlcVersion: VERSION,\n configVersion: config.version,\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n },\n null,\n 2\n );\n }\n\n // Return specific section\n const sectionData: Record<string, unknown> = {\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n };\n\n return JSON.stringify(\n {\n section,\n data: sectionData[section] || null,\n },\n null,\n 2\n );\n },\n });\n}\n","/**\n * sdlc_design_workflow Tool\n *\n * Workflow design for Event Modeling using the 9-step methodology\n *\n * Guides the design of event-sourced workflows, creating commands,\n * events, read models, and vertical slices.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_design_workflow tool\n */\nexport interface DesignWorkflowArgs {\n workflowName: string;\n domainOverviewPath?: string;\n context?: string;\n step?: number;\n}\n\n/**\n * Event defined in the workflow\n */\nexport interface WorkflowEvent {\n name: string;\n description?: string;\n aggregateId?: string;\n payload?: Record<string, string>;\n}\n\n/**\n * Command defined in the workflow\n */\nexport interface WorkflowCommand {\n name: string;\n triggeredBy?: string;\n successEvents?: string[];\n failureEvents?: string[];\n}\n\n/**\n * Read model defined in the workflow\n */\nexport interface WorkflowReadModel {\n name: string;\n purpose?: string;\n eventsConsumed?: string[];\n}\n\n/**\n * Vertical slice for implementation\n */\nexport interface VerticalSlice {\n name: string;\n commands?: string[];\n events?: string[];\n readModels?: string[];\n userStory?: string;\n}\n\n/**\n * Result from sdlc_design_workflow tool\n */\nexport interface DesignWorkflowResult {\n success: boolean;\n outputPath?: string;\n events?: WorkflowEvent[];\n commands?: WorkflowCommand[];\n readModels?: WorkflowReadModel[];\n slices?: VerticalSlice[];\n currentStep?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_design_workflow tool\n */\nexport function createDesignWorkflowTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Workflow design for Event Modeling using the 9-step methodology.\n\nThis tool spawns an agent that guides workflow design through:\n1. Brain Storming - List all events (orange)\n2. The Plot - Arrange events on timeline\n3. The Story - Identify UIs and views (white)\n4. Blueprint - Identify commands (blue)\n5. Specification - Document business rules\n6. Elaboration - Flesh out event details\n7. Read Models - Design projections (green)\n8. Automation - Design policies (lilac)\n9. Vertical Slices - Break into implementable pieces\n\nCreates: docs/event_model/workflows/{name}/overview.md\n\nUse AFTER domain discovery. Workflows become GitHub epics, slices become issues.\n\nReturns:\n- outputPath: Path to the generated workflow document\n- events: List of identified events\n- commands: List of commands\n- readModels: List of read models\n- slices: Vertical slices for implementation`,\n\n args: {\n workflowName: tool.schema\n .string()\n .describe(\"Name of the workflow (e.g., 'Order Submission', 'User Registration')\"),\n domainOverviewPath: tool.schema\n .string()\n .optional()\n .describe(\n \"Path to domain overview for context (default: docs/event_model/domain/overview.md)\"\n ),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context (PRD requirements, existing events, etc.)\"),\n step: tool.schema\n .number()\n .optional()\n .describe(\"Start from a specific step (1-9). Omit to run all steps.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeWorkflowDesign(ctx, config, args as DesignWorkflowArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeWorkflowDesign(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DesignWorkflowArgs\n): Promise<DesignWorkflowResult> {\n // Validate inputs\n if (!args.workflowName) {\n return {\n success: false,\n error: \"workflowName is required\",\n suggestion: \"Provide a name for the workflow being designed\",\n };\n }\n\n // Normalize workflow name for file paths\n const normalizedName = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Load domain context if available\n let domainContext = \"\";\n const domainPath =\n args.domainOverviewPath || join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n try {\n domainContext = await readFile(domainPath, \"utf-8\");\n } catch {\n // Domain overview not found - continue without it\n }\n\n // Load workflow design prompt\n const workflowPrompt = await loadWorkflowPrompt(ctx.directory, args, domainContext);\n\n // Spawn workflow design agent\n const agentResult = await spawnWorkflowAgent(ctx, config, workflowPrompt, args.workflowName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"Workflow design agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the workflow document\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedName,\n \"overview.md\"\n );\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write workflow document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n return {\n success: true,\n outputPath,\n events: agentResult.events,\n commands: agentResult.commands,\n readModels: agentResult.readModels,\n slices: agentResult.slices,\n currentStep: args.step || 9,\n };\n}\n\nasync function loadWorkflowPrompt(\n projectDir: string,\n args: DesignWorkflowArgs,\n domainContext: string\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"workflow-design.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInWorkflowPrompt();\n }\n\n // Add context-specific instructions\n const stepInstructions = args.step\n ? `\\n**Start from Step ${args.step}** - Previous steps are complete.\\n`\n : \"\\n**Complete all 9 steps** in sequence.\\n\";\n\n const contextInstructions = `\n## Workflow Design Task\n\n**Workflow Name:** ${args.workflowName}\n\n${domainContext ? `**Domain Context:**\\n\\`\\`\\`markdown\\n${domainContext}\\n\\`\\`\\`\\n` : \"**Note:** No domain overview found. Proceed with discovery embedded in workflow design.\"}\n\n${args.context ? `**Additional Context:**\\n${args.context}` : \"\"}\n${stepInstructions}\n**Instructions:**\n1. Design the \"${args.workflowName}\" workflow using the 9-step methodology\n2. Identify all events, commands, read models, and automations\n3. Break down into vertical slices for implementation\n4. Output the complete workflow design document\n\n**Output:**\nCreate a comprehensive workflow design following the template structure.\nThe document will be saved to: docs/event_model/workflows/${args.workflowName.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}/overview.md\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInWorkflowPrompt(): string {\n return `# Workflow Design Agent\n\nYou are a workflow design expert for Event Modeling.\n\n## The 9 Steps\n\n1. **Events (Orange)** - Brainstorm all events in past tense\n2. **Timeline** - Arrange events chronologically\n3. **UIs (White)** - Identify user interfaces\n4. **Commands (Blue)** - Identify commands (imperative)\n5. **Business Rules** - Document validation rules\n6. **Event Details** - Define event payloads\n7. **Read Models (Green)** - Design projections\n8. **Automations (Lilac)** - Design policies\n9. **Vertical Slices** - Break into implementable pieces\n\n## Event Modeling Patterns\n\n- **Command**: Trigger → Command → Event(s)\n- **View**: Events → Read Model projection\n- **Automation**: Event → Policy → Command\n- **Translation**: External Data → Internal Event\n\n## Naming Conventions\n\n**Events** (past tense): OrderSubmitted, PaymentReceived\n**Commands** (imperative): SubmitOrder, ProcessPayment\n**Read Models** (noun): OrderSummary, CustomerDashboard\n\n## Output\n\nCreate a markdown document covering all 9 steps with:\n- Events list with payloads\n- Commands with triggers and outputs\n- Read models with schemas\n- Vertical slices with acceptance criteria`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n events?: WorkflowEvent[];\n commands?: WorkflowCommand[];\n readModels?: WorkflowReadModel[];\n slices?: VerticalSlice[];\n error?: string;\n}\n\nasync function spawnWorkflowAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n workflowName: string\n): Promise<AgentResult> {\n try {\n // Create session for workflow design agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - Workflow Design: ${workflowName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create workflow design agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent - use Oracle model for design expertise\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from workflow design agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in workflow design agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract structured data\n const parsed = parseWorkflowAgentResponse(content);\n\n return {\n success: true,\n document: content,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Workflow design agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseWorkflowAgentResponse(content: string): Partial<AgentResult> {\n const events: WorkflowEvent[] = [];\n const commands: WorkflowCommand[] = [];\n const readModels: WorkflowReadModel[] = [];\n const slices: VerticalSlice[] = [];\n\n // Extract events - look for PascalCase words followed by \"event\" context or in Events section\n const eventSection = content.match(\n /##?\\s*Events?\\s*\\(?\\s*Orange\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (eventSection) {\n const eventMatches = eventSection[1].matchAll(\n /[-*]\\s*\\*?\\*?([A-Z][a-zA-Z]+(?:ed|en|ted|red|sed))\\*?\\*?/g\n );\n for (const match of eventMatches) {\n events.push({ name: match[1] });\n }\n }\n\n // Extract commands - look for imperative PascalCase in Commands section\n const commandSection = content.match(\n /##?\\s*Commands?\\s*\\(?\\s*Blue\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (commandSection) {\n const commandMatches = commandSection[1].matchAll(/###?\\s*([A-Z][a-zA-Z]+)/g);\n for (const match of commandMatches) {\n const name = match[1];\n // Skip if it looks like an event (past tense)\n if (!name.match(/ed$|en$/)) {\n commands.push({ name });\n }\n }\n }\n\n // Extract read models - look for View/Projection names\n const readModelSection = content.match(\n /##?\\s*Read Models?\\s*\\(?\\s*Green\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (readModelSection) {\n const modelMatches = readModelSection[1].matchAll(\n /###?\\s*([A-Z][a-zA-Z]+(?:View|Summary|Dashboard|Status|List)?)/g\n );\n for (const match of modelMatches) {\n readModels.push({ name: match[1] });\n }\n }\n\n // Extract vertical slices\n const sliceSection = content.match(/##?\\s*Vertical Slices?\\s*[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i);\n if (sliceSection) {\n const sliceMatches = sliceSection[1].matchAll(\n /###?\\s*(?:Slice\\s*\\d+:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g\n );\n for (const match of sliceMatches) {\n const name = match[1].trim();\n if (name && !name.includes(\"Commands\") && !name.includes(\"Events\")) {\n slices.push({ name });\n }\n }\n }\n\n return {\n events: events.length > 0 ? events : undefined,\n commands: commands.length > 0 ? commands : undefined,\n readModels: readModels.length > 0 ? readModels : undefined,\n slices: slices.length > 0 ? slices : undefined,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeWorkflowDesign,\n loadWorkflowPrompt,\n parseWorkflowAgentResponse,\n};\n","/**\n * sdlc_discover_domain Tool\n *\n * Domain discovery for Event Modeling\n *\n * Identifies actors, goals, major processes and creates\n * the domain overview document.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_discover_domain tool\n */\nexport interface DiscoverDomainArgs {\n domainName: string;\n context?: string;\n}\n\n/**\n * Result from sdlc_discover_domain tool\n */\nexport interface DiscoverDomainResult {\n success: boolean;\n outputPath?: string;\n actors?: string[];\n processes?: string[];\n boundaries?: {\n core: string[];\n supporting: string[];\n external: string[];\n };\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_discover_domain tool\n */\nexport function createDiscoverDomainTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Domain discovery for Event Modeling.\n\nThis tool spawns an agent that guides domain discovery by:\n- Identifying actors (human, system, time-based)\n- Understanding goals for each actor\n- Mapping major business processes\n- Finding domain boundaries (core, supporting, external)\n\nCreates: docs/event_model/domain/overview.md\n\nUse this BEFORE designing workflows. Discovery captures the \"what\" and \"who\"\nwithout implementation details.\n\nReturns:\n- outputPath: Path to the generated overview document\n- actors: List of identified actors\n- processes: List of major processes\n- boundaries: Core, supporting, and external domain boundaries`,\n\n args: {\n domainName: tool.schema\n .string()\n .describe(\n \"Name of the domain being modeled (e.g., 'Order Management', 'User Authentication')\"\n ),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context about the domain (PRD excerpt, user research, etc.)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDiscovery(ctx, config, args as DiscoverDomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeDiscovery(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DiscoverDomainArgs\n): Promise<DiscoverDomainResult> {\n // Validate inputs\n if (!args.domainName) {\n return {\n success: false,\n error: \"domainName is required\",\n suggestion: \"Provide a name for the domain being modeled\",\n };\n }\n\n // Load discovery prompt\n const discoveryPrompt = await loadDiscoveryPrompt(ctx.directory, args);\n\n // Spawn discovery agent\n const agentResult = await spawnDiscoveryAgent(ctx, config, discoveryPrompt, args.domainName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"Discovery agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the discovery document\n const outputPath = join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write discovery document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n return {\n success: true,\n outputPath,\n actors: agentResult.actors,\n processes: agentResult.processes,\n boundaries: agentResult.boundaries,\n };\n}\n\nasync function loadDiscoveryPrompt(projectDir: string, args: DiscoverDomainArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"discovery.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInDiscoveryPrompt();\n }\n\n // Add context-specific instructions\n const contextInstructions = `\n## Discovery Task\n\n**Domain Name:** ${args.domainName}\n\n${args.context ? `**Additional Context:**\\n${args.context}` : \"\"}\n\n**Instructions:**\n1. Guide the discovery process for the \"${args.domainName}\" domain\n2. Identify all actors, their goals, and interactions\n3. Map out the major business processes\n4. Define clear domain boundaries\n5. Create a glossary of key terms\n6. Output the complete domain overview document\n\n**Output:**\nCreate a comprehensive domain overview following the template structure.\nThe document will be saved to: docs/event_model/domain/overview.md\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInDiscoveryPrompt(): string {\n return `# Domain Discovery Agent\n\nYou are a domain discovery expert for Event Modeling.\n\n## Your Goal\n\nGuide domain discovery by identifying:\n- **Actors**: Who interacts with the system?\n- **Goals**: What do they want to achieve?\n- **Processes**: What major workflows exist?\n- **Boundaries**: What's in scope vs. out of scope?\n\n## Output Format\n\nCreate a markdown document with:\n\n1. **Summary** - Brief domain description\n2. **Actors** - List with type, goals, interactions\n3. **Major Processes** - List with triggers, actors, outputs\n4. **Domain Boundaries** - Core, supporting, external\n5. **Glossary** - Key business terms\n6. **Open Questions** - Items needing clarification\n\n## Guidelines\n\n- Use business language, not technical jargon\n- Ask clarifying questions for ambiguous terms\n- Capture the \"why\" behind each element\n- Note assumptions for validation\n- Keep scope focused`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n actors?: string[];\n processes?: string[];\n boundaries?: {\n core: string[];\n supporting: string[];\n external: string[];\n };\n error?: string;\n}\n\nasync function spawnDiscoveryAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n domainName: string\n): Promise<AgentResult> {\n try {\n // Create session for discovery agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - Domain Discovery: ${domainName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create discovery agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent - use Oracle model for domain expertise\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from discovery agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in discovery agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract structured data\n const parsed = parseDiscoveryAgentResponse(content);\n\n return {\n success: true,\n document: content,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Discovery agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseDiscoveryAgentResponse(content: string): Partial<AgentResult> {\n const actors: string[] = [];\n const processes: string[] = [];\n const boundaries = {\n core: [] as string[],\n supporting: [] as string[],\n external: [] as string[],\n };\n\n // Extract actors (look for ### Actor: or ## Actors section)\n const actorMatches = content.matchAll(/###?\\s*(?:Actor:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g);\n for (const match of actorMatches) {\n const actorName = match[1].trim();\n if (actorName && !actorName.includes(\"Type\") && !actorName.includes(\"Goals\")) {\n actors.push(actorName);\n }\n }\n\n // Extract processes (look for ### Process: or ## Major Processes section)\n const processMatches = content.matchAll(/###?\\s*(?:Process:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g);\n for (const match of processMatches) {\n const processName = match[1].trim();\n if (\n processName &&\n !processName.includes(\"Trigger\") &&\n !processName.includes(\"Actor\") &&\n !processName.includes(\"Output\")\n ) {\n processes.push(processName);\n }\n }\n\n // Extract boundaries\n const coreSection = content.match(\n /###?\\s*(?:Core Domain|In Scope)[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (coreSection) {\n const items = coreSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.core = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n const supportingSection = content.match(\n /###?\\s*Supporting Domain[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (supportingSection) {\n const items = supportingSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.supporting = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n const externalSection = content.match(\n /###?\\s*(?:External|Out of Scope|Generic)[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (externalSection) {\n const items = externalSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.external = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n return {\n actors: actors.length > 0 ? actors : undefined,\n processes: processes.length > 0 ? processes : undefined,\n boundaries:\n boundaries.core.length > 0 ||\n boundaries.supporting.length > 0 ||\n boundaries.external.length > 0\n ? boundaries\n : undefined,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeDiscovery,\n loadDiscoveryPrompt,\n parseDiscoveryAgentResponse,\n};\n","/**\n * sdlc_generate_gwt Tool\n *\n * Generate Given/When/Then scenarios for Event Modeling\n *\n * Creates executable specifications for commands, projections,\n * and automations based on the workflow design.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_generate_gwt tool\n */\nexport interface GenerateGwtArgs {\n workflowName: string;\n sliceName?: string;\n workflowPath?: string;\n scenarioTypes?: (\"command\" | \"projection\" | \"automation\")[];\n}\n\n/**\n * A GWT scenario\n */\nexport interface GwtScenario {\n name: string;\n type: \"command\" | \"projection\" | \"automation\";\n tags?: string[];\n given: string[];\n when: string;\n then: string[];\n}\n\n/**\n * Result from sdlc_generate_gwt tool\n */\nexport interface GenerateGwtResult {\n success: boolean;\n outputPath?: string;\n scenarios?: GwtScenario[];\n commandScenarios?: number;\n projectionScenarios?: number;\n automationScenarios?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_generate_gwt tool\n */\nexport function createGenerateGwtTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Generate Given/When/Then scenarios for Event Modeling.\n\nThis tool spawns an agent that creates GWT scenarios based on:\n- **Command scenarios**: Given=prior events, When=command, Then=resulting events OR error\n- **Projection scenarios**: Given=read model state, When=event, Then=updated state\n- **Automation scenarios**: Given=policy active, When=trigger event, Then=command issued\n\nCreates: docs/event_model/workflows/{workflow}/scenarios/{slice}.feature\n\nUse AFTER workflow design. GWT scenarios become acceptance criteria for GitHub issues.\n\nReturns:\n- outputPath: Path to the generated feature file\n- scenarios: List of generated scenarios\n- commandScenarios: Count of command scenarios\n- projectionScenarios: Count of projection scenarios\n- automationScenarios: Count of automation scenarios`,\n\n args: {\n workflowName: tool.schema.string().describe(\"Name of the workflow to generate scenarios for\"),\n sliceName: tool.schema\n .string()\n .optional()\n .describe(\"Specific slice to generate scenarios for. Omit to generate for all slices.\"),\n workflowPath: tool.schema\n .string()\n .optional()\n .describe(\n \"Path to workflow document (default: docs/event_model/workflows/{name}/overview.md)\"\n ),\n scenarioTypes: tool.schema\n .array(tool.schema.enum([\"command\", \"projection\", \"automation\"]))\n .optional()\n .describe(\"Types of scenarios to generate. Omit to generate all types.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGwtGeneration(ctx, config, args as GenerateGwtArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeGwtGeneration(\n ctx: PluginInput,\n config: SdlcConfig,\n args: GenerateGwtArgs\n): Promise<GenerateGwtResult> {\n // Validate inputs\n if (!args.workflowName) {\n return {\n success: false,\n error: \"workflowName is required\",\n suggestion: \"Provide the name of the workflow to generate scenarios for\",\n };\n }\n\n // Normalize names for file paths\n const normalizedWorkflow = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n const normalizedSlice = args.sliceName\n ? args.sliceName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n : \"all-slices\";\n\n // Load workflow context\n const workflowPath =\n args.workflowPath ||\n join(ctx.directory, \"docs\", \"event_model\", \"workflows\", normalizedWorkflow, \"overview.md\");\n\n let workflowContext = \"\";\n try {\n workflowContext = await readFile(workflowPath, \"utf-8\");\n } catch {\n return {\n success: false,\n error: `Workflow document not found: ${workflowPath}`,\n suggestion: \"Run sdlc_design_workflow first to create the workflow document\",\n };\n }\n\n // Load GWT generation prompt\n const gwtPrompt = await loadGwtPrompt(ctx.directory, args, workflowContext);\n\n // Spawn GWT generation agent\n const agentResult = await spawnGwtAgent(ctx, config, gwtPrompt, args.workflowName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"GWT generation agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the feature file\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedWorkflow,\n \"scenarios\",\n `${normalizedSlice}.feature`\n );\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write feature file: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n // Count scenarios by type\n const commandScenarios = agentResult.scenarios?.filter((s) => s.type === \"command\").length || 0;\n const projectionScenarios =\n agentResult.scenarios?.filter((s) => s.type === \"projection\").length || 0;\n const automationScenarios =\n agentResult.scenarios?.filter((s) => s.type === \"automation\").length || 0;\n\n return {\n success: true,\n outputPath,\n scenarios: agentResult.scenarios,\n commandScenarios,\n projectionScenarios,\n automationScenarios,\n };\n}\n\nasync function loadGwtPrompt(\n projectDir: string,\n args: GenerateGwtArgs,\n workflowContext: string\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"gwt-generation.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInGwtPrompt();\n }\n\n // Determine which scenario types to generate\n const scenarioTypes = args.scenarioTypes || [\"command\", \"projection\", \"automation\"];\n const typeInstructions = scenarioTypes.map((t) => `- ${t} scenarios`).join(\"\\n\");\n\n const contextInstructions = `\n## GWT Generation Task\n\n**Workflow:** ${args.workflowName}\n${args.sliceName ? `**Slice:** ${args.sliceName}` : \"**Scope:** All slices\"}\n\n**Generate these scenario types:**\n${typeInstructions}\n\n**Workflow Context:**\n\\`\\`\\`markdown\n${workflowContext}\n\\`\\`\\`\n\n**Instructions:**\n1. Analyze the workflow document for commands, events, read models, and automations\n2. Generate GWT scenarios following the patterns:\n - Command: Given=prior events, When=command, Then=resulting events OR error\n - Projection: Given=read model state, When=event, Then=updated state\n - Automation: Given=policy active, When=trigger event, Then=command issued\n3. Include happy path AND validation/error scenarios for commands\n4. Use business language, not technical jargon\n5. Include concrete example values, not placeholders\n\n**Output:**\nCreate a Gherkin feature file with all scenarios.\nUse tags like @command, @projection, @automation, @happy-path, @validation\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInGwtPrompt(): string {\n return `# GWT Generation Agent\n\nYou are a GWT scenario expert for Event Modeling.\n\n## Scenario Patterns\n\n### Command Scenarios\n\\`\\`\\`gherkin\n@command @happy-path\nScenario: Successfully {action}\n Given {prior events that set up state}\n When {Command} is issued with:\n | field | value |\n Then {SuccessEvent} should be emitted with:\n | field | expected |\n\n@command @validation\nScenario: Reject {command} when {rule violated}\n Given {state that violates rule}\n When {Command} is issued\n Then {ValidationFailed} should be emitted with:\n | reason | {specific violation} |\n\\`\\`\\`\n\n### Projection/View Scenarios\n\\`\\`\\`gherkin\n@projection\nScenario: Update {ReadModel} when {Event}\n Given {ReadModel} contains:\n | field | old_value |\n When {Event} is applied\n Then {ReadModel} should contain:\n | field | new_value |\n\\`\\`\\`\n\n### Automation Scenarios\n\nAutomations are like views but triggered externally rather than by user interaction.\n\n**Trigger Types:**\n- **Timer/Scheduled**: Periodic processing (e.g., daily batch, every 5 minutes)\n- **Event-Triggered**: Reactive to message bus events\n- **Inbox-Based**: Polls a projection for pending work items\n\n\\`\\`\\`gherkin\n@automation @timer-triggered\nScenario: Process pending {items} on scheduled tick\n Given {Automation} is active\n And {InboxProjection} contains pending items:\n | id | status | createdAt |\n | item-1 | pending | 2024-01-01 |\n When the scheduler triggers at {time}\n Then {ProcessItem} command should be issued for \"item-1\"\n\n@automation @event-triggered\nScenario: React to {Event} from message bus\n Given {Automation} is active\n And {precondition state}\n When {ExternalEvent} is received from {source}\n Then {Command} should be issued with:\n | field | derived_value |\n\n@automation @inbox-based\nScenario: Process items from {Inbox} projection\n Given {Automation} is active\n And {InboxProjection} contains:\n | id | priority | payload |\n | work-1 | high | {data} |\n When the automation polls the inbox\n Then {ProcessWork} command should be issued for \"work-1\"\n And the inbox item should be marked as processing\n\n@automation @skip-condition\nScenario: Skip processing when {condition}\n Given {Automation} is active\n And {state that prevents processing}\n When {trigger occurs}\n Then no command should be issued\n\\`\\`\\`\n\n## Guidelines\n\n- One behavior per scenario\n- Use concrete values, not placeholders\n- Cover happy path + all validation rules\n- Include error scenarios\n- Tag scenarios for organization\n- For automations: cover trigger, skip conditions, and error handling`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n scenarios?: GwtScenario[];\n error?: string;\n}\n\nasync function spawnGwtAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n workflowName: string\n): Promise<AgentResult> {\n try {\n // Create session for GWT generation agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - GWT Generation: ${workflowName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create GWT generation agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from GWT generation agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in GWT generation agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract scenarios\n const scenarios = parseGwtScenarios(content);\n\n return {\n success: true,\n document: content,\n scenarios,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `GWT generation agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseGwtScenarios(content: string): GwtScenario[] {\n const scenarios: GwtScenario[] = [];\n\n // Match Gherkin scenarios\n const scenarioMatches = content.matchAll(\n /(@[a-z-]+(?:\\s+@[a-z-]+)*\\s*)?\\s*Scenario:\\s*(.+?)\\n([\\s\\S]*?)(?=(?:@[a-z-]+\\s*)?\\s*Scenario:|$)/gi\n );\n\n for (const match of scenarioMatches) {\n const tagsStr = match[1]?.trim() || \"\";\n const name = match[2].trim();\n const body = match[3];\n\n // Extract tags\n const tagMatches = tagsStr.match(/@[a-z-]+/g);\n const tags: string[] = tagMatches ? [...tagMatches] : [];\n\n // Determine type from tags\n let type: \"command\" | \"projection\" | \"automation\" = \"command\";\n if (tags.includes(\"@projection\")) type = \"projection\";\n else if (tags.includes(\"@automation\")) type = \"automation\";\n\n // Extract Given clauses\n const givenMatches = body.matchAll(/Given\\s+(.+?)(?=\\n\\s*(?:And|When|Then)|$)/gi);\n const given = [...givenMatches].map((m) => m[1].trim());\n\n // Also get And clauses after Given\n const andAfterGivenMatches = body.matchAll(\n /Given[\\s\\S]*?(And\\s+(.+?)(?=\\n\\s*(?:And|When|Then)|$))/gi\n );\n for (const andMatch of andAfterGivenMatches) {\n given.push(andMatch[2].trim());\n }\n\n // Extract When clause\n const whenMatch = body.match(/When\\s+(.+?)(?=\\n\\s*(?:And|Then)|$)/i);\n const when = whenMatch ? whenMatch[1].trim() : \"\";\n\n // Extract Then clauses\n const thenMatches = body.matchAll(/Then\\s+(.+?)(?=\\n\\s*(?:And|$)|$)/gi);\n const then = [...thenMatches].map((m) => m[1].trim());\n\n // Also get And clauses after Then\n const andAfterThenMatches = body.matchAll(/Then[\\s\\S]*?(And\\s+(.+?)(?=\\n\\s*(?:And|$)|$))/gi);\n for (const andMatch of andAfterThenMatches) {\n then.push(andMatch[2].trim());\n }\n\n if (name && when) {\n scenarios.push({\n name,\n type,\n tags,\n given,\n when,\n then,\n });\n }\n }\n\n return scenarios;\n}\n\n// Export for testing\nexport const _testExports = {\n executeGwtGeneration,\n loadGwtPrompt,\n parseGwtScenarios,\n};\n","/**\n * sdlc_validate_model Tool\n *\n * Validate Event Model for completeness and consistency\n *\n * Checks event naming conventions, information completeness,\n * and ensures no implementation details during modeling.\n */\n\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Arguments for sdlc_validate_model tool\n */\nexport interface ValidateModelArgs {\n scope?: \"all\" | \"domain\" | \"workflow\" | \"scenarios\";\n workflowName?: string;\n fix?: boolean;\n}\n\n/**\n * A validation issue found in the model\n */\nexport interface ValidationIssue {\n severity: \"error\" | \"warning\" | \"info\";\n category: \"naming\" | \"completeness\" | \"consistency\" | \"implementation\";\n location: string;\n message: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_validate_model tool\n */\nexport interface ValidateModelResult {\n success: boolean;\n valid: boolean;\n issues: ValidationIssue[];\n summary: {\n errors: number;\n warnings: number;\n infos: number;\n };\n filesChecked: string[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_validate_model tool\n */\nexport function createValidateModelTool(ctx: PluginInput, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Validate Event Model for completeness and consistency.\n\nThis tool checks the event model documents for:\n- **Naming conventions**: Events in past tense, commands imperative\n- **Information completeness**: All required sections present\n- **Consistency**: Events referenced in workflows exist in domain\n- **No implementation details**: No database schemas, API endpoints, etc.\n\nChecks:\n- docs/event_model/domain/overview.md\n- docs/event_model/workflows/*/overview.md\n- docs/event_model/workflows/*/scenarios/*.feature\n\nReturns:\n- valid: Boolean indicating if model passes validation\n- issues: List of validation issues with severity and suggestions\n- summary: Count of errors, warnings, and infos\n- filesChecked: List of files that were validated`,\n\n args: {\n scope: tool.schema\n .enum([\"all\", \"domain\", \"workflow\", \"scenarios\"])\n .optional()\n .describe(\n \"What to validate: all (default), domain only, workflows only, or scenarios only\"\n ),\n workflowName: tool.schema\n .string()\n .optional()\n .describe(\"Specific workflow to validate. Omit to validate all.\"),\n fix: tool.schema\n .boolean()\n .optional()\n .describe(\"Attempt to auto-fix simple issues (like naming). Default: false\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeValidation(ctx, args as ValidateModelArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeValidation(\n ctx: PluginInput,\n args: ValidateModelArgs\n): Promise<ValidateModelResult> {\n const issues: ValidationIssue[] = [];\n const filesChecked: string[] = [];\n const scope = args.scope || \"all\";\n\n const eventModelDir = join(ctx.directory, \"docs\", \"event_model\");\n\n // Validate domain overview\n if (scope === \"all\" || scope === \"domain\") {\n const domainPath = join(eventModelDir, \"domain\", \"overview.md\");\n try {\n const content = await readFile(domainPath, \"utf-8\");\n filesChecked.push(domainPath);\n issues.push(...validateDomainOverview(content, domainPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: domainPath,\n message: \"Domain overview not found\",\n suggestion: \"Run sdlc_discover_domain to create the domain overview\",\n });\n }\n }\n\n // Validate workflows\n if (scope === \"all\" || scope === \"workflow\" || scope === \"scenarios\") {\n const workflowsDir = join(eventModelDir, \"workflows\");\n let workflowDirs: string[] = [];\n\n try {\n const entries = await readdir(workflowsDir, { withFileTypes: true });\n workflowDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n // Only warn about missing workflows if we're actually trying to check them\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: workflowsDir,\n message: \"No workflows directory found\",\n suggestion: \"Run sdlc_design_workflow to create workflow designs\",\n });\n }\n\n // Filter to specific workflow if requested\n if (args.workflowName) {\n const normalized = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n workflowDirs = workflowDirs.filter((d) => d === normalized);\n }\n\n for (const workflowDir of workflowDirs) {\n const workflowPath = join(workflowsDir, workflowDir, \"overview.md\");\n\n // Validate workflow overview\n if (scope === \"all\" || scope === \"workflow\") {\n try {\n const content = await readFile(workflowPath, \"utf-8\");\n filesChecked.push(workflowPath);\n issues.push(...validateWorkflowOverview(content, workflowPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: workflowPath,\n message: `Workflow overview not found for ${workflowDir}`,\n suggestion: \"Run sdlc_design_workflow to create the workflow design\",\n });\n }\n }\n\n // Validate scenarios\n if (scope === \"all\" || scope === \"scenarios\") {\n const scenariosDir = join(workflowsDir, workflowDir, \"scenarios\");\n try {\n const scenarioFiles = await readdir(scenariosDir);\n for (const scenarioFile of scenarioFiles) {\n if (scenarioFile.endsWith(\".feature\")) {\n const scenarioPath = join(scenariosDir, scenarioFile);\n const content = await readFile(scenarioPath, \"utf-8\");\n filesChecked.push(scenarioPath);\n issues.push(...validateScenarios(content, scenarioPath));\n }\n }\n } catch {\n // No scenarios directory - not an error, might not be generated yet\n issues.push({\n severity: \"info\",\n category: \"completeness\",\n location: scenariosDir,\n message: `No scenarios found for ${workflowDir}`,\n suggestion: \"Run sdlc_generate_gwt to create GWT scenarios\",\n });\n }\n }\n }\n }\n\n // Calculate summary\n const summary = {\n errors: issues.filter((i) => i.severity === \"error\").length,\n warnings: issues.filter((i) => i.severity === \"warning\").length,\n infos: issues.filter((i) => i.severity === \"info\").length,\n };\n\n return {\n success: true,\n valid: summary.errors === 0,\n issues,\n summary,\n filesChecked,\n };\n}\n\nfunction validateDomainOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Summary\", \"Actors\", \"Processes\", \"Boundaries\", \"Glossary\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the domain overview`,\n });\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(api|endpoint|rest|graphql|http)\\b/i, term: \"API terminology\" },\n { pattern: /\\b(class|interface|function|method)\\b/i, term: \"code terminology\" },\n { pattern: /\\b(json|xml|yaml)\\b/i, term: \"data format terminology\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Domain overview contains ${term}`,\n suggestion: \"Use business language instead of technical terminology\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateWorkflowOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Events\", \"Commands\", \"Read Models\", \"Vertical Slices\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the workflow`,\n });\n }\n }\n\n // Check event naming (should be past tense)\n const eventSection = content.match(/##?\\s*Events?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i);\n if (eventSection) {\n const events = eventSection[1].match(/\\b([A-Z][a-zA-Z]+)\\b/g) || [];\n for (const event of events) {\n // Check if it looks like a command (imperative) instead of an event (past tense)\n if (event.match(/^(Create|Update|Delete|Add|Remove|Set|Get|Send|Process|Handle|Submit)/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Event \"${event}\" uses imperative naming (command-style)`,\n suggestion: `Use past tense: ${suggestPastTense(event)}`,\n });\n }\n }\n }\n\n // Check command naming (should be imperative)\n const commandSection = content.match(/##?\\s*Commands?[^\\n]*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (commandSection) {\n const commands = commandSection[1].match(/###?\\s*([A-Z][a-zA-Z]+)/g) || [];\n for (const cmdMatch of commands) {\n const command = cmdMatch.replace(/^###?\\s*/, \"\");\n // Check if it looks like an event (past tense) instead of a command\n if (command.match(/ed$|en$/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Command \"${command}\" uses past tense (event-style)`,\n suggestion: `Use imperative: ${suggestImperative(command)}`,\n });\n }\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(endpoint|rest|graphql|http|url)\\b/i, term: \"API terminology\" },\n { pattern: /\\btypescript|javascript|python|java\\b/i, term: \"language references\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Workflow contains ${term}`,\n suggestion: \"Keep workflow design implementation-agnostic\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateScenarios(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for Feature header\n if (!content.match(/^Feature:/m)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"Missing Feature header\",\n suggestion: \"Add a Feature: header at the start of the file\",\n });\n }\n\n // Check for at least one scenario\n if (!content.match(/Scenario:/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"No scenarios defined\",\n suggestion: \"Add at least one Scenario: block\",\n });\n }\n\n // Check that scenarios have Given/When/Then\n const scenarioMatches = content.matchAll(/Scenario:\\s*(.+?)\\n([\\s\\S]*?)(?=Scenario:|$)/gi);\n for (const match of scenarioMatches) {\n const scenarioName = match[1].trim();\n const scenarioBody = match[2];\n\n if (!scenarioBody.match(/\\bGiven\\b/i)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Given clause`,\n suggestion: \"Add a Given clause to set up the initial state\",\n });\n }\n\n if (!scenarioBody.match(/\\bWhen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing When clause`,\n suggestion: \"Add a When clause to specify the action\",\n });\n }\n\n if (!scenarioBody.match(/\\bThen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Then clause`,\n suggestion: \"Add a Then clause to specify expected outcomes\",\n });\n }\n }\n\n // Check for placeholder values\n const placeholderPatterns = [\n { pattern: /\\{[a-z_]+\\}/i, term: \"placeholder in braces\" },\n { pattern: /<[a-z_]+>/i, term: \"placeholder in angle brackets\" },\n { pattern: /\\bTODO\\b/i, term: \"TODO marker\" },\n { pattern: /\\bXXX\\b/i, term: \"XXX marker\" },\n ];\n\n for (const { pattern, term } of placeholderPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenarios contain ${term}`,\n suggestion: \"Replace placeholders with concrete example values\",\n });\n }\n }\n\n return issues;\n}\n\nfunction suggestPastTense(command: string): string {\n // Simple suggestions for common patterns\n if (command.startsWith(\"Create\")) return command.replace(\"Create\", \"Created\");\n if (command.startsWith(\"Update\")) return command.replace(\"Update\", \"Updated\");\n if (command.startsWith(\"Delete\")) return command.replace(\"Delete\", \"Deleted\");\n if (command.startsWith(\"Add\")) return command.replace(\"Add\", \"Added\");\n if (command.startsWith(\"Remove\")) return command.replace(\"Remove\", \"Removed\");\n if (command.startsWith(\"Set\")) return command.replace(\"Set\", \"Set\"); // Already past\n if (command.startsWith(\"Send\")) return command.replace(\"Send\", \"Sent\");\n if (command.startsWith(\"Submit\")) return command.replace(\"Submit\", \"Submitted\");\n if (command.startsWith(\"Process\")) return command.replace(\"Process\", \"Processed\");\n return `${command}ed`;\n}\n\nfunction suggestImperative(event: string): string {\n // Simple suggestions for common patterns\n if (event.endsWith(\"Created\")) return event.replace(\"Created\", \"Create\");\n if (event.endsWith(\"Updated\")) return event.replace(\"Updated\", \"Update\");\n if (event.endsWith(\"Deleted\")) return event.replace(\"Deleted\", \"Delete\");\n if (event.endsWith(\"Added\")) return event.replace(\"Added\", \"Add\");\n if (event.endsWith(\"Removed\")) return event.replace(\"Removed\", \"Remove\");\n if (event.endsWith(\"Sent\")) return event.replace(\"Sent\", \"Send\");\n if (event.endsWith(\"Submitted\")) return event.replace(\"Submitted\", \"Submit\");\n if (event.endsWith(\"Processed\")) return event.replace(\"Processed\", \"Process\");\n if (event.endsWith(\"ed\")) return event.slice(0, -2);\n return event;\n}\n\n// Export for testing\nexport const _testExports = {\n executeValidation,\n validateDomainOverview,\n validateWorkflowOverview,\n validateScenarios,\n suggestPastTense,\n suggestImperative,\n};\n","/**\n * sdlc_get_context tool\n *\n * Quick access to current issue context from tracker.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\n\n/**\n * Create the sdlc_get_context tool\n */\nexport function createGetContextTool(tracker: IssueTracker, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Get the current issue context without reloading from GitHub.\n\nReturns the cached context from the issue tracker including:\n- Current issue number and status\n- When the issue was started\n- Recent activity history\n\nUse this for quick status checks. Use sdlc_get_issue to reload full context from GitHub.`,\n\n args: {},\n\n async execute(): Promise<string> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return JSON.stringify({\n status: \"no_active_issue\",\n message: \"No issue is currently being tracked. Use sdlc_get_issue to load an issue.\",\n });\n }\n\n const context = await tracker.getCurrentIssueContext();\n const history = tracker.getHistory().slice(-10);\n\n return JSON.stringify(\n {\n currentIssue: {\n number: currentIssue.issueNumber,\n status: currentIssue.status,\n startedAt: currentIssue.startedAt,\n completedAt: currentIssue.completedAt,\n },\n contextSummary: context,\n recentHistory: history,\n sessionId: tracker.getSessionId(),\n },\n null,\n 2\n );\n },\n });\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { GetIssueResult, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { fetchIssue, listIssues, moveIssueToStatus } from \"../utils/github-issues.js\";\nimport { parseAcceptanceCriteria } from \"../utils/issue-parser.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"get-issue\");\n\nexport function createGetIssueTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Load a GitHub issue for implementation.\n\nReturns:\n- Issue title and body\n- Acceptance criteria parsed from issue checkboxes\n- Instructions for next steps\n\nIf issue is in Ready status, it will be moved to In progress automatically.`,\n\n args: {\n issueNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"GitHub issue number. If omitted, loads next Ready issue.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await getIssueContext(ctx, tracker, config, args.issueNumber);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function getIssueContext(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber?: number\n): Promise<GetIssueResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n let targetIssueNumber = issueNumber;\n\n if (!targetIssueNumber) {\n const readyIssues = await listIssues(ctx, config, \"Ready\", 1);\n if (readyIssues.length === 0) {\n return {\n error: \"No Ready issues found\",\n suggestion: \"Move an issue to Ready status in the project board\",\n };\n }\n targetIssueNumber = readyIssues[0].number;\n }\n\n const issue = await fetchIssue(ctx, config, targetIssueNumber);\n if (!issue) {\n return {\n error: `Issue #${targetIssueNumber} not found`,\n suggestion: \"Check the issue number and repository settings\",\n };\n }\n\n const acceptanceCriteria = parseAcceptanceCriteria(issue.body);\n\n // Auto-move Ready -> In progress\n if (issue.state === \"OPEN\" || issue.state === \"open\") {\n const moved = await moveIssueToStatus(ctx, config, issue.number, \"In progress\");\n if (moved) {\n log.info(\"Auto-moved issue to In progress\", { issueNumber: issue.number });\n }\n }\n\n await tracker.setCurrentIssue(issue.number, {\n title: issue.title,\n status: \"In progress\",\n startedAt: new Date().toISOString(),\n url: issue.url,\n body: issue.body,\n });\n\n return {\n issueNumber: issue.number,\n title: issue.title,\n body: issue.body || \"\",\n url: issue.url,\n status: \"In progress\",\n acceptanceCriteria,\n instructions: \"Use todowrite with the provided todos to track acceptance criteria.\",\n };\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { ListIssuesResult, SdlcConfig } from \"../../shared/types.js\";\nimport { listIssues } from \"../utils/github-issues.js\";\n\nexport function createListIssuesTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `List GitHub issues from the configured repository.\n\nOptionally filter by status column name (e.g., Ready, In progress, Done).`,\n\n args: {\n status: tool.schema.string().optional().describe(\"Filter by status column name\"),\n limit: tool.schema.number().int().positive().optional().describe(\"Max issues to return\"),\n },\n\n async execute(args): Promise<string> {\n const issues = await listIssues(ctx, config, args.status, args.limit ?? 20);\n const result: ListIssuesResult = {\n success: true,\n issues: issues.map((i) => ({\n number: i.number,\n title: i.title,\n status: i.status || i.state,\n url: i.url,\n })),\n };\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_remember Tool\n *\n * Store context/discoveries to persistent memory for future sessions.\n * Wraps Memento MCP when available, falls back to local file storage.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"remember\");\n\n/**\n * Memory entry stored in the memory store\n */\nexport interface MemoryEntry {\n key: string;\n content: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n projectDir?: string;\n}\n\n/**\n * Memory store structure\n */\nexport interface MemoryStore {\n version: string;\n entries: Record<string, MemoryEntry>;\n}\n\n/**\n * Result from sdlc_remember tool\n */\nexport interface RememberResult {\n success: boolean;\n key?: string;\n stored?: boolean;\n updated?: boolean;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_remember tool\n */\nexport interface RememberArgs {\n key: string;\n content: string;\n tags?: string[];\n}\n\nconst MEMORY_DIR = \".opencode\";\nconst MEMORY_FILE = \"sdlc-memory.json\";\n\n/**\n * Get the path to the memory store file\n */\nfunction getMemoryStorePath(): string {\n return join(homedir(), MEMORY_DIR, MEMORY_FILE);\n}\n\n/**\n * Load the memory store from disk\n */\nasync function loadMemoryStore(): Promise<MemoryStore> {\n const storePath = getMemoryStorePath();\n\n try {\n const content = await readFile(storePath, \"utf-8\");\n return JSON.parse(content) as MemoryStore;\n } catch {\n // Return empty store if file doesn't exist\n return {\n version: \"1.0.0\",\n entries: {},\n };\n }\n}\n\n/**\n * Save the memory store to disk\n */\nasync function saveMemoryStore(store: MemoryStore): Promise<void> {\n const storePath = getMemoryStorePath();\n const storeDir = join(homedir(), MEMORY_DIR);\n\n // Ensure directory exists\n await mkdir(storeDir, { recursive: true });\n\n await writeFile(storePath, JSON.stringify(store, null, 2), \"utf-8\");\n}\n\n/**\n * Check if Memento MCP integration is enabled\n */\nfunction isMementoEnabled(config: SdlcConfig): boolean {\n const features = config.features as SdlcFeatures;\n return features?.memento === true;\n}\n\n/**\n * Store a memory using Memento MCP\n *\n * Note: This spawns a mini-agent that uses the Memento MCP tools.\n * The Memento MCP must be configured in OpenCode's MCP settings.\n */\nasync function storeWithMemento(\n ctx: PluginInput,\n config: SdlcConfig,\n args: RememberArgs\n): Promise<RememberResult> {\n try {\n // Create a session to interact with Memento MCP\n const createResult = await ctx.client.session.create({\n body: {\n title: `Memory: ${args.key}`,\n },\n });\n\n if (!createResult.data?.id) {\n throw new Error(\"Failed to create Memento session\");\n }\n\n const sessionId = createResult.data.id;\n\n try {\n // Build prompt to use Memento's store_memory tool\n const tagsStr = args.tags?.length ? `\\nTags: ${args.tags.join(\", \")}` : \"\";\n const prompt = `Use the memento store_memory tool to store this memory:\n\nKey: ${args.key}\nContent: ${args.content}${tagsStr}\n\nStore this information and confirm it was saved successfully.`;\n\n const modelConfig = parseModelConfig(\n config.models.librarian || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n log.info(\"Stored memory via Memento MCP\", { key: args.key });\n\n return {\n success: true,\n key: args.key,\n stored: true,\n };\n } finally {\n // Session cleanup happens automatically\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.warn(\"Memento MCP store failed, falling back to local\", { error: message });\n\n // Fall back to local storage\n return storeLocally(ctx, args);\n }\n}\n\n/**\n * Store a memory locally\n */\nasync function storeLocally(ctx: PluginInput, args: RememberArgs): Promise<RememberResult> {\n try {\n const store = await loadMemoryStore();\n const now = new Date().toISOString();\n\n const existingEntry = store.entries[args.key];\n const isUpdate = !!existingEntry;\n\n store.entries[args.key] = {\n key: args.key,\n content: args.content,\n tags: args.tags || [],\n createdAt: existingEntry?.createdAt || now,\n updatedAt: now,\n projectDir: ctx.directory,\n };\n\n await saveMemoryStore(store);\n\n log.info(isUpdate ? \"Updated memory locally\" : \"Stored memory locally\", { key: args.key });\n\n return {\n success: true,\n key: args.key,\n stored: !isUpdate,\n updated: isUpdate,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to store memory: ${message}`,\n suggestion: \"Check file system permissions for ~/.opencode/\",\n };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create the sdlc_remember tool\n */\nexport function createRememberTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Store context, discoveries, or insights to persistent memory for future sessions.\n\nThis tool saves information that should persist across sessions, such as:\n- Project conventions and patterns learned during development\n- Debugging insights that might be useful later\n- Domain knowledge discovered during implementation\n- Technical decisions and their rationale\n\nMemories are stored with a unique key and optional tags for organization.\nUse descriptive keys like \"auth/jwt-token-format\" or \"api/error-handling-pattern\".\n\nWhen Memento MCP is enabled, memories sync across all OpenCode projects.\nOtherwise, memories are stored locally in ~/.opencode/sdlc-memory.json.`,\n\n args: {\n key: tool.schema\n .string()\n .describe(\n \"Unique identifier for this memory. Use slash-separated paths for organization (e.g., 'project/component/topic')\"\n ),\n content: tool.schema\n .string()\n .describe(\"The content to remember. Be descriptive - this will be recalled later.\"),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Tags for categorization and filtering (e.g., ['debugging', 'auth', 'api'])\"),\n },\n\n async execute(args): Promise<string> {\n const rememberArgs = args as RememberArgs;\n\n // Validate required fields\n if (!rememberArgs.key?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Key is required\",\n suggestion: \"Provide a unique key for this memory\",\n });\n }\n\n if (!rememberArgs.content?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Content is required\",\n suggestion: \"Provide the content to remember\",\n });\n }\n\n // Use Memento if enabled, otherwise local storage\n const result = isMementoEnabled(config)\n ? await storeWithMemento(ctx, config, rememberArgs)\n : await storeLocally(ctx, rememberArgs);\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n loadMemoryStore,\n saveMemoryStore,\n storeLocally,\n isMementoEnabled,\n getMemoryStorePath,\n};\n","/**\n * sdlc_recall Tool\n *\n * Query persistent memory to retrieve relevant context from past sessions.\n * Wraps Memento MCP when available, falls back to local file storage.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport {\n type MemoryEntry,\n type MemoryStore,\n _testExports as rememberExports,\n} from \"./memory-remember.js\";\n\nconst log = createPluginLogger(\"recall\");\n\nconst { loadMemoryStore, isMementoEnabled } = rememberExports;\n\n/**\n * Result from sdlc_recall tool\n */\nexport interface RecallResult {\n success: boolean;\n memories?: MemoryEntry[];\n count?: number;\n query?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_recall tool\n */\nexport interface RecallArgs {\n query: string;\n tags?: string[];\n limit?: number;\n projectOnly?: boolean;\n}\n\n/**\n * Calculate similarity between two strings (simple token-based)\n */\nfunction calculateSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.toLowerCase().split(/\\W+/).filter(Boolean));\n const tokensB = new Set(b.toLowerCase().split(/\\W+/).filter(Boolean));\n\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n\n const union = new Set([...tokensA, ...tokensB]).size;\n return intersection / union;\n}\n\n/**\n * Score a memory entry against a query\n */\nfunction scoreMemory(entry: MemoryEntry, query: string, tags?: string[]): number {\n let score = 0;\n\n // Key match (highest priority)\n if (entry.key.toLowerCase().includes(query.toLowerCase())) {\n score += 0.5;\n }\n\n // Content similarity\n score += calculateSimilarity(query, entry.content) * 0.3;\n\n // Tag matches\n if (tags && tags.length > 0) {\n const matchingTags = entry.tags.filter((t) =>\n tags.some((qt) => t.toLowerCase().includes(qt.toLowerCase()))\n );\n score += (matchingTags.length / tags.length) * 0.2;\n }\n\n // Boost for exact key match\n if (entry.key.toLowerCase() === query.toLowerCase()) {\n score += 0.5;\n }\n\n return score;\n}\n\n/**\n * Query memories using Memento MCP\n */\nasync function recallWithMemento(\n ctx: PluginInput,\n config: SdlcConfig,\n args: RecallArgs\n): Promise<RecallResult> {\n try {\n // Create a session to interact with Memento MCP\n const createResult = await ctx.client.session.create({\n body: {\n title: `Recall: ${args.query}`,\n },\n });\n\n if (!createResult.data?.id) {\n throw new Error(\"Failed to create Memento session\");\n }\n\n const sessionId = createResult.data.id;\n\n try {\n // Build prompt to use Memento's search_memory tool\n const tagsStr = args.tags?.length ? `\\nFilter by tags: ${args.tags.join(\", \")}` : \"\";\n const limitStr = args.limit ? `\\nLimit results to: ${args.limit}` : \"\";\n const prompt = `Use the memento search_memory tool to find memories matching:\n\nQuery: ${args.query}${tagsStr}${limitStr}\n\nSearch for relevant memories and return the results as JSON with this structure:\n{\n \"memories\": [\n {\n \"key\": \"memory-key\",\n \"content\": \"memory content\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"createdAt\": \"ISO date\",\n \"updatedAt\": \"ISO date\"\n }\n ]\n}`;\n\n const modelConfig = parseModelConfig(\n config.models.librarian || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n throw new Error(\"No response from Memento session\");\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const responseText = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Try to parse JSON from response\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\"memories\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as { memories: MemoryEntry[] };\n log.info(\"Recalled memories via Memento MCP\", {\n query: args.query,\n count: parsed.memories?.length || 0,\n });\n return {\n success: true,\n memories: parsed.memories || [],\n count: parsed.memories?.length || 0,\n query: args.query,\n };\n }\n\n throw new Error(\"Could not parse Memento response\");\n } finally {\n // Session cleanup happens automatically\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.warn(\"Memento MCP recall failed, falling back to local\", { error: message });\n\n // Fall back to local storage\n return recallLocally(ctx, args);\n }\n}\n\n/**\n * Query memories from local storage\n */\nasync function recallLocally(ctx: PluginInput, args: RecallArgs): Promise<RecallResult> {\n try {\n const store: MemoryStore = await loadMemoryStore();\n const entries = Object.values(store.entries);\n\n if (entries.length === 0) {\n return {\n success: true,\n memories: [],\n count: 0,\n query: args.query,\n };\n }\n\n // Filter by project if requested\n let filtered = entries;\n if (args.projectOnly) {\n filtered = entries.filter((e) => e.projectDir === ctx.directory);\n }\n\n // Score and sort entries by relevance\n const scored = filtered\n .map((entry) => ({\n entry,\n score: scoreMemory(entry, args.query, args.tags),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n // Apply limit\n const limit = args.limit || 10;\n const results = scored.slice(0, limit).map((item) => item.entry);\n\n log.info(\"Recalled memories locally\", {\n query: args.query,\n count: results.length,\n total: entries.length,\n });\n\n return {\n success: true,\n memories: results,\n count: results.length,\n query: args.query,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to recall memories: ${message}`,\n suggestion: \"Check if ~/.opencode/sdlc-memory.json exists and is valid JSON\",\n };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create the sdlc_recall tool\n */\nexport function createRecallTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Query persistent memory to retrieve relevant context from past sessions.\n\nUse this tool before starting work to:\n- Check for existing knowledge about a component or feature\n- Recall debugging insights that might be relevant\n- Find documented patterns or conventions\n- Review previous decisions and their rationale\n\nThe query is matched against memory keys, content, and tags.\nResults are ranked by relevance and returned in order.\n\nExamples:\n- query: \"authentication\" - finds all memories related to auth\n- query: \"api/error-handling\" - finds specific key or related content\n- query: \"jwt\" with tags: [\"auth\", \"security\"] - filtered search\n\nWhen Memento MCP is enabled, searches across all OpenCode projects.\nOtherwise, searches local memory in ~/.opencode/sdlc-memory.json.`,\n\n args: {\n query: tool.schema\n .string()\n .describe(\n \"Search query to find relevant memories. Can be a key path or keywords from content.\"\n ),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Filter results by tags (e.g., ['debugging', 'auth'])\"),\n limit: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of results to return (default: 10)\"),\n projectOnly: tool.schema\n .boolean()\n .optional()\n .describe(\"Only return memories from the current project directory\"),\n },\n\n async execute(args): Promise<string> {\n const recallArgs = args as RecallArgs;\n\n // Validate required fields\n if (!recallArgs.query?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Query is required\",\n suggestion: \"Provide a search query to find relevant memories\",\n });\n }\n\n // Use Memento if enabled, otherwise local storage\n const result = isMementoEnabled(config)\n ? await recallWithMemento(ctx, config, recallArgs)\n : await recallLocally(ctx, recallArgs);\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n recallLocally,\n calculateSimilarity,\n scoreMemory,\n};\n","/**\n * sdlc_mutation Tool\n *\n * Runs mutation testing to verify test suite quality.\n * Supports: cargo-mutants (Rust), Stryker (JS/TS), mutmut (Python), Muzak (Elixir)\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Supported mutation testing frameworks\n */\nexport type MutationFramework = \"stryker\" | \"cargo-mutants\" | \"mutmut\" | \"muzak\" | \"auto\";\n\n/**\n * A surviving mutant from mutation testing\n */\nexport interface SurvivingMutant {\n id: string;\n file: string;\n line?: number;\n original: string;\n mutation: string;\n mutationType: string;\n}\n\n/**\n * Mutation testing result\n */\nexport interface MutationResult {\n success: boolean;\n framework?: MutationFramework;\n totalMutants?: number;\n killed?: number;\n survived?: number;\n timedOut?: number;\n score?: number;\n threshold?: number;\n passed?: boolean;\n survivors?: SurvivingMutant[];\n reportPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_mutation tool\n */\nexport interface MutationArgs {\n targetPath?: string;\n framework?: MutationFramework;\n timeout?: number;\n}\n\n/**\n * Create the sdlc_mutation tool\n */\nexport function createMutationTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Run mutation testing to verify test suite quality.\n\nMutation testing creates small changes (mutants) in the code and checks\nif tests detect them. Surviving mutants indicate test gaps.\n\nSupported frameworks:\n- stryker: JavaScript/TypeScript\n- cargo-mutants: Rust\n- mutmut: Python\n- muzak: Elixir\n- auto: Detect from project files\n\nReturns:\n- score: Percentage of mutants killed (higher is better)\n- passed: Whether score meets configured threshold\n- survivors: List of surviving mutants with analysis\n- reportPath: Path to detailed HTML report (if available)`,\n\n args: {\n targetPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to file or directory to mutate (default: src/)\"),\n framework: tool.schema\n .enum([\"stryker\", \"cargo-mutants\", \"mutmut\", \"muzak\", \"auto\"])\n .optional()\n .describe(\"Mutation testing framework (default: auto-detect)\"),\n timeout: tool.schema\n .number()\n .optional()\n .describe(\"Timeout per mutant in seconds (default: 60)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeMutation(ctx, config, args as MutationArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeMutation(\n ctx: PluginInput,\n config: SdlcConfig,\n args: MutationArgs\n): Promise<MutationResult> {\n // Determine framework\n const framework =\n args.framework === \"auto\" || !args.framework ? detectFramework(ctx.directory) : args.framework;\n\n if (!framework) {\n return {\n success: false,\n error: \"Could not detect mutation testing framework\",\n suggestion: \"Install a mutation testing framework or specify --framework\",\n };\n }\n\n // Check if framework is available\n const available = await checkFrameworkAvailable(ctx, framework);\n if (!available) {\n return {\n success: false,\n error: `Framework ${framework} is not installed`,\n suggestion: getInstallSuggestion(framework),\n };\n }\n\n // Get threshold from config\n const threshold = config.tdd?.mutationTesting?.requiredScore ?? 80;\n\n // Run mutation testing\n const targetPath = args.targetPath || \"src/\";\n const timeout = args.timeout || 60;\n\n const runResult = await runMutationTesting(ctx, framework, targetPath, timeout);\n\n if (!runResult.success) {\n return {\n success: false,\n framework,\n error: runResult.error,\n suggestion: runResult.suggestion,\n };\n }\n\n // Parse results\n const parsed = parseMutationOutput(runResult.output || \"\", framework);\n\n // Calculate score\n const score = parsed.totalMutants > 0 ? (parsed.killed / parsed.totalMutants) * 100 : 0;\n\n const passed = score >= threshold;\n\n // Save report if available\n let reportPath: string | undefined;\n if (parsed.survivors.length > 0) {\n reportPath = join(ctx.directory, \".opencode\", \"mutation-report.md\");\n try {\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, generateReport(parsed, score, threshold), \"utf-8\");\n } catch {\n // Non-fatal\n }\n }\n\n return {\n success: true,\n framework,\n totalMutants: parsed.totalMutants,\n killed: parsed.killed,\n survived: parsed.survived,\n timedOut: parsed.timedOut,\n score: Math.round(score * 10) / 10,\n threshold,\n passed,\n survivors: parsed.survivors.slice(0, 10), // Limit to 10 for response size\n reportPath,\n };\n}\n\nfunction detectFramework(directory: string): MutationFramework | null {\n // Check for project files to determine language/framework\n if (existsSync(join(directory, \"Cargo.toml\"))) {\n return \"cargo-mutants\";\n }\n if (\n existsSync(join(directory, \"stryker.conf.json\")) ||\n existsSync(join(directory, \"stryker.conf.js\")) ||\n existsSync(join(directory, \"stryker.conf.mjs\"))\n ) {\n return \"stryker\";\n }\n if (existsSync(join(directory, \"package.json\"))) {\n return \"stryker\"; // Default for JS/TS projects\n }\n if (existsSync(join(directory, \"setup.py\")) || existsSync(join(directory, \"pyproject.toml\"))) {\n return \"mutmut\";\n }\n if (existsSync(join(directory, \"mix.exs\"))) {\n return \"muzak\";\n }\n return null;\n}\n\nasync function checkFrameworkAvailable(\n ctx: PluginInput,\n framework: MutationFramework\n): Promise<boolean> {\n try {\n switch (framework) {\n case \"stryker\":\n await ctx.$`npx stryker --version`;\n return true;\n case \"cargo-mutants\":\n await ctx.$`cargo mutants --version`;\n return true;\n case \"mutmut\":\n await ctx.$`mutmut --version`;\n return true;\n case \"muzak\":\n await ctx.$`mix help muzak`;\n return true;\n default:\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction getInstallSuggestion(framework: MutationFramework): string {\n switch (framework) {\n case \"stryker\":\n return \"Install with: npm install --save-dev @stryker-mutator/core\";\n case \"cargo-mutants\":\n return \"Install with: cargo install cargo-mutants\";\n case \"mutmut\":\n return \"Install with: pip install mutmut\";\n case \"muzak\":\n return 'Add {:muzak, \"~> 1.0\", only: :test} to mix.exs';\n default:\n return \"Install the appropriate mutation testing framework for your project\";\n }\n}\n\ninterface RunResult {\n success: boolean;\n output?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function runMutationTesting(\n ctx: PluginInput,\n framework: MutationFramework,\n targetPath: string,\n timeout: number\n): Promise<RunResult> {\n try {\n let result: { stdout: Buffer | string };\n\n switch (framework) {\n case \"stryker\":\n result = await ctx.$`npx stryker run --mutate ${targetPath}/**/*.ts`;\n break;\n case \"cargo-mutants\":\n result = await ctx.$`cargo mutants --timeout ${timeout}`;\n break;\n case \"mutmut\":\n result = await ctx.$`mutmut run --paths-to-mutate ${targetPath}`;\n break;\n case \"muzak\":\n result = await ctx.$`mix muzak`;\n break;\n default:\n return {\n success: false,\n error: `Unknown framework: ${framework}`,\n };\n }\n\n return {\n success: true,\n output: String(result.stdout),\n };\n } catch (error) {\n // Mutation testing often returns non-zero exit codes for surviving mutants\n // Check if we got output anyway\n const errorObj = error as { stdout?: Buffer | string; message?: string };\n if (errorObj.stdout) {\n return {\n success: true,\n output: String(errorObj.stdout),\n };\n }\n return {\n success: false,\n error: errorObj.message || \"Mutation testing failed\",\n suggestion: \"Check test command and framework configuration\",\n };\n }\n}\n\ninterface ParsedMutation {\n totalMutants: number;\n killed: number;\n survived: number;\n timedOut: number;\n survivors: SurvivingMutant[];\n}\n\nfunction parseMutationOutput(output: string, framework: MutationFramework): ParsedMutation {\n const result: ParsedMutation = {\n totalMutants: 0,\n killed: 0,\n survived: 0,\n timedOut: 0,\n survivors: [],\n };\n\n // Stryker output parsing\n if (framework === \"stryker\") {\n const totalMatch = output.match(/Ran (\\d+) mutants/i);\n const killedMatch = output.match(/Killed:\\s*(\\d+)/i);\n const survivedMatch = output.match(/Survived:\\s*(\\d+)/i);\n const timedOutMatch = output.match(/Timed out:\\s*(\\d+)/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse surviving mutants\n const survivorMatches = output.matchAll(/Survived:\\s*([^\\n]+?)\\s*\\(([^)]+):(\\d+)\\)/gi);\n for (const match of survivorMatches) {\n result.survivors.push({\n id: `stryker-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // cargo-mutants output parsing\n if (framework === \"cargo-mutants\") {\n const totalMatch = output.match(/(\\d+) mutants tested/i);\n const killedMatch = output.match(/(\\d+) caught/i);\n const survivedMatch = output.match(/(\\d+) missed/i);\n const timedOutMatch = output.match(/(\\d+) timed out/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse MISSED mutants\n const missedMatches = output.matchAll(/MISSED\\s+([^\\n]+?)\\s+in\\s+([^:]+):(\\d+)/gi);\n for (const match of missedMatches) {\n result.survivors.push({\n id: `cargo-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // mutmut output parsing\n if (framework === \"mutmut\") {\n const statusMatch = output.match(/(\\d+)\\/(\\d+)/);\n if (statusMatch) {\n result.killed = Number.parseInt(statusMatch[1], 10);\n result.totalMutants = Number.parseInt(statusMatch[2], 10);\n result.survived = result.totalMutants - result.killed;\n }\n }\n\n // muzak output parsing\n if (framework === \"muzak\") {\n const summaryMatch = output.match(/(\\d+) killed, (\\d+) survived/i);\n if (summaryMatch) {\n result.killed = Number.parseInt(summaryMatch[1], 10);\n result.survived = Number.parseInt(summaryMatch[2], 10);\n result.totalMutants = result.killed + result.survived;\n }\n }\n\n return result;\n}\n\nfunction generateReport(parsed: ParsedMutation, score: number, threshold: number): string {\n const passedStr = score >= threshold ? \"PASSED\" : \"FAILED\";\n\n let report = `# Mutation Testing Report\n\n## Summary\n- **Score:** ${score.toFixed(1)}%\n- **Threshold:** ${threshold}%\n- **Status:** ${passedStr}\n\n## Statistics\n| Metric | Count |\n|--------|-------|\n| Total Mutants | ${parsed.totalMutants} |\n| Killed | ${parsed.killed} |\n| Survived | ${parsed.survived} |\n| Timed Out | ${parsed.timedOut} |\n\n## Surviving Mutants\n\n`;\n\n if (parsed.survivors.length === 0) {\n report += \"No surviving mutants - excellent test coverage!\\n\";\n } else {\n for (const survivor of parsed.survivors) {\n report += `### ${survivor.id}\n**File:** \\`${survivor.file}${survivor.line ? `:${survivor.line}` : \"\"}\\`\n**Mutation:** ${survivor.mutation}\n\n---\n\n`;\n }\n }\n\n return report;\n}\n\n// Export for testing\nexport const _testExports = {\n executeMutation,\n detectFramework,\n parseMutationOutput,\n generateReport,\n};\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n ApplyDecisionsResult,\n DiscussionRound,\n PartyDiscussionState,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { fetchIssue, updateIssueBody } from \"./github-issues.js\";\n\nconst DECISIONS_HEADER = \"## Party Review Decisions\";\nconst FINDING_ID_PREFIX = \"Finding ID:\";\nconst DECISION_PREFIX = \"Decision:\";\n\nfunction getDecisionIcon(decision: ReviewDecision): string {\n switch (decision) {\n case \"accept\":\n return \"✅\";\n case \"defer\":\n return \"⏸️\";\n case \"reject\":\n return \"❌\";\n default:\n return \"⚪\";\n }\n}\n\nfunction formatDecisionRound(round: DiscussionRound): string {\n const lines = [\n `### ${getDecisionIcon(round.decision ?? \"pending\")} ${round.findingTitle}`,\n `- ${FINDING_ID_PREFIX} ${round.findingId}`,\n `- ${DECISION_PREFIX} ${round.decision ?? \"pending\"}`,\n `- Severity: ${round.findingSeverity}`,\n `- Category: ${round.findingCategory}`,\n ];\n\n if (round.decisionReason) {\n lines.push(`- Reason: ${round.decisionReason}`);\n }\n\n if (round.deferredTo) {\n lines.push(`- Deferred to: ${round.deferredTo}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildDecisionSection(state: PartyDiscussionState): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const decisions = state.completedRounds.map(formatDecisionRound).join(\"\\n\\n\");\n\n return `${DECISIONS_HEADER}\\n\\n**Date**: ${date}\\n**Session ID**: ${state.sessionId}\\n\\n${decisions}`;\n}\n\nfunction mergeDecisionSection(body: string, section: string): string {\n const existingIndex = body.indexOf(DECISIONS_HEADER);\n if (existingIndex === -1) {\n return `${body.trim()}\\n\\n---\\n\\n${section}`.trim();\n }\n\n return `${body.slice(0, existingIndex).trim()}\\n\\n${section}`.trim();\n}\n\nfunction resolveIssueNumbers(state: PartyDiscussionState): number[] {\n const raw = state.identifier\n .split(\",\")\n .map((token) => token.trim())\n .filter(Boolean);\n\n const numbers = raw\n .map((token) => token.replace(/^#/, \"\"))\n .map((token) => Number.parseInt(token, 10))\n .filter((value) => Number.isFinite(value) && value > 0);\n\n return Array.from(new Set(numbers));\n}\n\nexport async function applyIssueDecisions(\n ctx: PluginInput,\n config: SdlcConfig,\n state: PartyDiscussionState\n): Promise<ApplyDecisionsResult> {\n const issueNumbers = resolveIssueNumbers(state);\n const updated: Array<{ issueNumber: number; appliedDecisions: number }> = [];\n\n if (issueNumbers.length === 0) {\n return {\n success: false,\n reviewDocumentUpdated: false,\n summary: {\n accepted: 0,\n deferred: 0,\n rejected: 0,\n issuesModified: 0,\n },\n error: \"No issue numbers available to update\",\n };\n }\n\n const decisionSection = buildDecisionSection(state);\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n const updatedBody = mergeDecisionSection(issue.body || \"\", decisionSection);\n const success = await updateIssueBody(ctx, config, issueNumber, updatedBody);\n\n if (success) {\n updated.push({ issueNumber, appliedDecisions: state.completedRounds.length });\n }\n }\n\n const accepted = state.completedRounds.filter((round) => round.decision === \"accept\").length;\n const deferred = state.completedRounds.filter((round) => round.decision === \"defer\").length;\n const rejected = state.completedRounds.filter((round) => round.decision === \"reject\").length;\n\n return {\n success: updated.length > 0,\n reviewDocumentUpdated: false,\n issuesUpdated: updated,\n summary: {\n accepted,\n deferred,\n rejected,\n issuesModified: updated.length,\n },\n warnings: updated.length === 0 ? [\"No issues updated\"] : undefined,\n };\n}\n","import type { FindingCategory, FindingSeverity } from \"../../shared/types.js\";\nimport type { FindingCounts } from \"./agent-selector.js\";\n\nexport interface FindingDetail {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n}\n\nexport interface OracleResponseSummary {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n}\n\nexport interface OracleResponseFindings {\n security: FindingDetail[];\n logic: FindingDetail[];\n bestPractices: FindingDetail[];\n performance: FindingDetail[];\n}\n\nexport interface IssueFinding {\n issueId: string;\n title: string;\n findings: Partial<OracleResponseFindings>;\n}\n\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n}\n\nexport interface ParsedOracleResponse {\n summary: OracleResponseSummary;\n findings?: OracleResponseFindings;\n issueFindings?: IssueFinding[];\n crossIssueIssues?: CrossIssueIssue[];\n}\n\nexport function parseOracleResponse(response: string | null | undefined): ParsedOracleResponse {\n if (!response || typeof response !== \"string\") {\n return createEmptyResponse(\"No response provided\");\n }\n\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return createEmptyResponse(\"No JSON found in Oracle response\");\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as ParsedOracleResponse;\n\n if (!parsed.summary) {\n return createEmptyResponse(\"No summary in Oracle response\");\n }\n\n return parsed;\n } catch {\n return createEmptyResponse(\"Failed to parse Oracle response as JSON\");\n }\n}\n\nfunction createEmptyResponse(reason: string): ParsedOracleResponse {\n return {\n summary: {\n totalIssues: 0,\n highSeverity: 0,\n mediumSeverity: 0,\n lowSeverity: 0,\n recommendation: reason,\n },\n findings: {\n security: [],\n logic: [],\n bestPractices: [],\n performance: [],\n },\n };\n}\n\nexport function countFindings(parsed: ParsedOracleResponse): FindingCounts {\n const counts: FindingCounts = {\n total: parsed.summary.totalIssues,\n high: parsed.summary.highSeverity,\n medium: parsed.summary.mediumSeverity,\n low: parsed.summary.lowSeverity,\n byCategory: {\n security: 0,\n logic: 0,\n bestPractices: 0,\n performance: 0,\n },\n };\n\n if (parsed.findings) {\n counts.byCategory.security = parsed.findings.security?.length || 0;\n counts.byCategory.logic = parsed.findings.logic?.length || 0;\n counts.byCategory.bestPractices = parsed.findings.bestPractices?.length || 0;\n counts.byCategory.performance = parsed.findings.performance?.length || 0;\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n counts.byCategory.security += issue.findings.security?.length || 0;\n counts.byCategory.logic += issue.findings.logic?.length || 0;\n counts.byCategory.bestPractices += issue.findings.bestPractices?.length || 0;\n counts.byCategory.performance += issue.findings.performance?.length || 0;\n }\n }\n\n return counts;\n}\n\nexport function extractAllFindings(parsed: ParsedOracleResponse): FindingDetail[] {\n const allFindings: FindingDetail[] = [];\n\n if (parsed.findings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = parsed.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = issue.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n }\n\n return allFindings;\n}\n\nexport function sortFindingsBySeverity(findings: FindingDetail[]): FindingDetail[] {\n const severityOrder: Record<FindingSeverity, number> = { high: 0, medium: 1, low: 2 };\n return [...findings].sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n}\n","/**\n * Shared TypeScript type definitions for OpenCode SDLC Plugin\n */\n\n// ============================================================================\n// CLI Types\n// ============================================================================\n\n/**\n * Options passed to the install command\n */\nexport interface InstallOptions {\n preset: string;\n yes: boolean;\n advanced: boolean;\n global: boolean;\n local: boolean;\n reconfigure?: boolean;\n}\n\n/**\n * Options passed to the upgrade command\n */\nexport interface UpgradeOptions {\n check: boolean;\n yes: boolean;\n}\n\n/**\n * Options passed to the doctor command\n */\nexport interface DoctorOptions {\n fix: boolean;\n}\n\n/**\n * Options passed to the uninstall command\n */\nexport interface UninstallOptions {\n keepConfig: boolean;\n keepDeps: boolean;\n}\n\n/**\n * Subscription information gathered during install\n */\nexport interface SubscriptionAnswers {\n hasClaude: boolean;\n claudeTier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n hasOpenAI: boolean;\n hasGoogle: boolean;\n googleAuth: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n hasGitHubCopilot: boolean;\n copilotPlan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n copilotEnabledModels?: string[];\n}\n\n/**\n * Methodology preferences gathered during install\n */\nexport interface MethodologyAnswers {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n}\n\n/**\n * Feature selections gathered during install\n */\nexport interface FeatureAnswers {\n enabledFeatures: string[];\n mcps: string[];\n}\n\n/**\n * Advanced options gathered during install\n */\nexport interface AdvancedAnswers {\n parallelIssueLimit?: number;\n experimental?: string[];\n autoFallback?: boolean;\n}\n\n/**\n * Available model choices by provider\n */\nexport type LLMProvider = \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n\n/**\n * Model definition\n */\nexport interface ModelChoice {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n}\n\n/**\n * Custom model definition for user-added models\n */\nexport interface CustomModelDefinition {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n capabilities?: {\n thinking?: boolean;\n contextWindow?: number;\n supportsTemperature?: boolean;\n };\n}\n\n/**\n * Agent roles that require model assignment\n */\nexport type AgentRole =\n | \"sisyphus\"\n | \"oracle\"\n | \"librarian\"\n | \"frontend\"\n | \"documentWriter\"\n | \"multimodalLooker\"\n | \"explore\";\n\n/**\n * Thinking level for reasoning-capable models\n */\nexport type ThinkingLevel = \"off\" | \"low\" | \"medium\" | \"high\";\n\n/**\n * Agent-specific settings for temperature and thinking level\n */\nexport interface AgentSettings {\n temperature?: number; // 0.0 - 1.0\n thinkingLevel?: ThinkingLevel;\n}\n\n/**\n * Model assignments for each agent role\n */\nexport interface ModelAnswers {\n sisyphus: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n explore?: string;\n settings?: {\n sisyphus?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n}\n\n/**\n * GitHub integration answers from the installer\n */\nexport interface GitHubAnswers {\n enabled: boolean;\n owner: string;\n repo: string;\n project?: number;\n statuses: GitHubStatus[];\n}\n\n/**\n * TDD configuration answers from the installer\n */\nexport interface TddAnswers {\n enabled: boolean;\n verbosity: TddVerbosity;\n bypassPatterns: string[];\n mutationTesting: {\n enabled: boolean;\n requiredScore: number;\n };\n}\n\n/**\n * Event Modeling answers from the installer\n */\nexport interface EventModelingAnswers {\n enabled: boolean;\n outputPath: string;\n}\n\n/**\n * Git Workflow answers from the installer\n */\nexport interface GitWorkflowAnswers {\n workflow: GitWorkflow;\n requireClean: boolean;\n worktrees: boolean;\n}\n\n/**\n * All answers from the install wizard\n */\nexport interface InstallAnswers {\n subscriptions: SubscriptionAnswers;\n models: ModelAnswers;\n methodology: MethodologyAnswers;\n features: FeatureAnswers;\n advanced: AdvancedAnswers;\n installLocation: \"global\" | \"local\";\n // New v0.3.0+ answers\n github?: GitHubAnswers;\n tdd?: TddAnswers;\n eventModeling?: EventModelingAnswers;\n gitWorkflow?: GitWorkflowAnswers;\n}\n\n/**\n * A file to be generated/written by the installer\n */\nexport interface GeneratedFile {\n path: string;\n content: string;\n exists: boolean;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\nexport interface AgentRouting {\n requiresThinking?: boolean;\n preferProvider?: LLMProvider;\n}\n\nexport interface RoutingConfig {\n providerPriority: LLMProvider[];\n modelFamilyPriority: {\n claude?: LLMProvider[];\n gpt?: LLMProvider[];\n gemini?: LLMProvider[];\n };\n agentOverrides: {\n sisyphus?: AgentRouting;\n oracle?: AgentRouting;\n librarian?: AgentRouting;\n frontend?: AgentRouting;\n documentWriter?: AgentRouting;\n multimodalLooker?: AgentRouting;\n };\n fallbackBehavior: {\n autoFallback: boolean;\n retryPeriodMs: number;\n notifyOnRateLimit: boolean;\n };\n}\n\n// ============================================================================\n// GitHub Issues Configuration\n// ============================================================================\n\n/**\n * GitHub project board column statuses\n */\nexport type GitHubStatus = \"Backlog\" | \"Ready\" | \"In progress\" | \"In review\" | \"Done\";\n\n/**\n * GitHub Issues integration configuration\n */\nexport interface GitHubConfig {\n /** GitHub repository owner (user or org) */\n owner: string;\n /** GitHub repository name */\n repo: string;\n /** GitHub Project number for board tracking (optional) */\n project?: number;\n /** Project board column names mapping to workflow states */\n statuses: GitHubStatus[];\n}\n\n// ============================================================================\n// TDD Configuration\n// ============================================================================\n\n/**\n * TDD verbosity levels\n */\nexport type TddVerbosity = \"silent\" | \"brief\" | \"explain\";\n\n/**\n * Mutation testing configuration\n */\nexport interface MutationTestingConfig {\n /** Enable mutation testing for coverage verification */\n enabled: boolean;\n /** Minimum mutation score required (0-100) */\n requiredScore: number;\n}\n\n/**\n * TDD cycle enforcement configuration\n */\nexport interface TddConfig {\n /** Enable TDD cycle enforcement */\n enabled: boolean;\n /** How verbose TDD feedback should be */\n verbosity: TddVerbosity;\n /** File patterns that bypass TDD checks (e.g., config files) */\n bypassPatterns: string[];\n /** Mutation testing settings */\n mutationTesting: MutationTestingConfig;\n}\n\n// ============================================================================\n// Event Modeling Configuration\n// ============================================================================\n\n/**\n * Event Modeling integration configuration\n */\nexport interface EventModelingConfig {\n /** Enable Event Modeling workflow */\n enabled: boolean;\n /** Path to event model output files */\n outputPath: string;\n}\n\n// ============================================================================\n// Git Workflow Configuration\n// ============================================================================\n\n/**\n * Git workflow types\n */\nexport type GitWorkflow = \"standard\" | \"git-spice\";\n\n/**\n * Git integration configuration\n */\nexport interface GitConfig {\n /** Git workflow style */\n workflow: GitWorkflow;\n /** Require clean working directory before operations */\n requireClean: boolean;\n /** Enable git worktrees for parallel work */\n worktrees: boolean;\n}\n\n// ============================================================================\n// Feature Flags\n// ============================================================================\n\n/**\n * SDLC feature flags\n */\nexport interface SdlcFeatures {\n /** Main conversation delegates all file writes to agents */\n orchestratorOnly: boolean;\n /** Auto-sync todos with GitHub issue checkboxes */\n todoSync: boolean;\n /** Enable party review for architecture decisions */\n partyReview: boolean;\n /** Enable debugging protocol with Oracle */\n debuggingProtocol: boolean;\n /** Enable Memento MCP for persistent memory */\n memento: boolean;\n /** Show in-TUI notifications */\n notifications: boolean;\n /** Enable LSP tools for code intelligence */\n lspTools: boolean;\n}\n\n// ============================================================================\n// MCP Configuration\n// ============================================================================\n\n/**\n * MCP (Model Context Protocol) server configuration\n */\nexport interface McpConfig {\n /** Context7 for library documentation */\n context7: boolean;\n /** Exa for web search */\n exa: boolean;\n /** grep.app for code search */\n grepApp: boolean;\n /** Memento for persistent memory */\n memento: boolean;\n}\n\n// ============================================================================\n// Main SDLC Configuration\n// ============================================================================\n\n/**\n * SDLC configuration file structure (v0.3.0+)\n *\n * This config supports a transitional state where:\n * - Old BMAD fields are optional (deprecated, for backward compatibility)\n * - New GitHub/TDD/EventModeling fields are optional (will become required in v0.4.0)\n *\n * New installations should use the new fields; existing installations\n * can continue using BMAD until migrated.\n */\nexport interface SdlcConfig {\n $schema?: string;\n version: string;\n subscriptions: {\n claude: {\n enabled: boolean;\n tier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n };\n openai: {\n enabled: boolean;\n };\n google: {\n enabled: boolean;\n authMethod: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n };\n githubCopilot: {\n enabled: boolean;\n plan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n enabledModels?: string[];\n };\n };\n models: {\n sisyphus: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n settings?: {\n sisyphus?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n };\n\n // ============================================================================\n // New v0.3.0+ Configuration (optional during migration, required in v0.4.0)\n // ============================================================================\n\n /** GitHub Issues integration (new in v0.3.0) */\n github?: GitHubConfig;\n /** TDD cycle enforcement (new in v0.3.0) */\n tdd?: TddConfig;\n /** Event Modeling integration (new in v0.3.0) */\n eventModeling?: EventModelingConfig;\n /** Git workflow configuration (new in v0.3.0) */\n git?: GitConfig;\n\n // ============================================================================\n // Legacy BMAD Configuration (deprecated, for backward compatibility)\n // ============================================================================\n\n /**\n * @deprecated Use `github` instead. Will be removed in v0.4.0.\n */\n bmad?: LegacyBmadConfig;\n\n // ============================================================================\n // Features and MCPs (unified structure supporting both old and new)\n // ============================================================================\n\n /** Feature flags */\n features: SdlcFeatures | LegacyFeatures;\n /** MCP server configuration */\n mcps: McpConfig | LegacyMcpConfig;\n /** Provider routing configuration */\n routing: RoutingConfig;\n}\n\n// ============================================================================\n// Legacy BMAD Configuration (Deprecated - for migration only)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfig instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport interface LegacyBmadConfig {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n parallelIssueLimit: number;\n paths?: {\n prd?: string | null;\n architecture?: string | null;\n };\n}\n\n/**\n * @deprecated Use SdlcFeatures instead. Legacy feature flags from pre-0.3.0.\n */\nexport interface LegacyFeatures {\n bmadBridge: boolean;\n autoStatus: boolean;\n parallelExecution: boolean;\n notifications: boolean;\n contextMonitor: boolean;\n commentChecker: boolean;\n lspTools: boolean;\n autoGitOperations: boolean;\n todoSync: boolean;\n}\n\n/**\n * @deprecated Use McpConfig instead. Legacy MCP config from pre-0.3.0.\n */\nexport interface LegacyMcpConfig {\n context7: boolean;\n exa: boolean;\n grepApp: boolean;\n}\n\n/**\n * Prerequisites check result\n */\nexport interface Prerequisites {\n opencode: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n sdlc: {\n installed: boolean;\n version?: string;\n };\n node: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n}\n\n// ============================================================================\n// Plugin Types\n// ============================================================================\n\n// ============================================================================\n// Legacy BMAD Types (deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story statuses.\n */\nexport type BmadStoryStatus =\n | \"backlog\"\n | \"ready-for-dev\"\n | \"in-progress\"\n | \"review\"\n | \"done\"\n | \"blocked\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic statuses.\n */\nexport type BmadEpicStatus = \"backlog\" | \"in-progress\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective statuses.\n */\nexport type BmadRetroStatus = \"optional\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD development status map.\n */\nexport type BmadDevelopmentStatus = BmadStoryStatus | BmadEpicStatus | BmadRetroStatus;\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD sprint status files.\n */\nexport interface BmadSprintStatus {\n generated?: string;\n project?: string;\n project_key?: string;\n tracking_system?: string;\n story_location?: string;\n current_story?: string | null;\n last_modified?: string;\n development_status: Record<string, BmadDevelopmentStatus>;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story keys.\n */\nexport interface ParsedStoryKey {\n epicNum: string;\n storyNum: string;\n titleSlug?: string;\n fullKey: string;\n normalizedId: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic keys.\n */\nexport interface ParsedEpicKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective keys.\n */\nexport interface ParsedRetroKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type DevelopmentKeyType = \"story\" | \"epic\" | \"retrospective\" | \"unknown\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type ParsedDevelopmentKey =\n | { type: \"story\"; parsed: ParsedStoryKey }\n | { type: \"epic\"; parsed: ParsedEpicKey }\n | { type: \"retrospective\"; parsed: ParsedRetroKey }\n | { type: \"unknown\"; key: string };\n\n/**\n * Tracked GitHub issue state\n */\nexport interface TrackedIssue {\n issueNumber: number;\n title: string;\n status: string;\n startedAt: string;\n completedAt?: string;\n url?: string;\n body?: string | null;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * @deprecated Result from sdlc_update_status tool (BMAD)\n */\n\n// ============================================================================\n// Party Review Types\n// ============================================================================\n\n/**\n * Scope of a party review\n */\nexport type ReviewScope = \"issue\" | \"multi-issue\";\n\n/**\n * Severity level of a review finding\n */\nexport type FindingSeverity = \"high\" | \"medium\" | \"low\";\n\n/**\n * Category of a review finding\n */\nexport type FindingCategory = \"security\" | \"logic\" | \"bestPractices\" | \"performance\";\n\n/**\n * User decision on a finding\n */\nexport type ReviewDecision = \"accept\" | \"defer\" | \"reject\" | \"pending\";\n\n/**\n * A single party review finding\n */\nexport interface PartyReviewFinding {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n issueId?: string;\n fileReference?: string;\n lineNumber?: number;\n decision?: ReviewDecision;\n decisionReason?: string;\n deferredTo?: string;\n}\n\n/**\n * Findings grouped by story\n */\nexport interface IssueFindings {\n issueId: string;\n title: string;\n findings: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n summary: {\n total: number;\n high: number;\n medium: number;\n low: number;\n };\n}\n\n/**\n * Cross-issue issues found in multi-issue reviews\n */\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n decision?: ReviewDecision;\n decisionReason?: string;\n}\n\n/**\n * Model complexity assessment result\n */\nexport interface IssueComplexity {\n isSimple: boolean;\n reason: string;\n recommendedModel: string;\n factors: {\n acceptanceCriteriaCount: number;\n hasSecurityConcerns: boolean;\n hasDataModelChanges: boolean;\n hasApiChanges: boolean;\n isCrudOnly: boolean;\n };\n}\n\n/**\n * Reference to another review document\n */\nexport interface ReviewDocumentReference {\n type: \"epic\" | \"focused\";\n filePath: string;\n date: string;\n findingsCount: number;\n acceptedCount: number;\n deferredCount: number;\n rejectedCount: number;\n}\n\n/**\n * Complete party review document structure\n */\nexport interface PartyReviewDocument {\n scope: ReviewScope;\n identifier: string;\n date: string;\n reviewer: string;\n relatedReviews?: ReviewDocumentReference[];\n summary: {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n };\n issueFindings?: IssueFindings[];\n crossIssueIssues?: CrossIssueIssue[];\n previousFindings?: {\n accepted: PartyReviewFinding[];\n deferred: PartyReviewFinding[];\n rejected: PartyReviewFinding[];\n };\n newFindings?: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n oracleAnalysis?: string;\n}\n\n/**\n * Complete result from applying all decisions\n */\nexport interface ApplyDecisionsResult {\n /** Overall success (true even if some individual updates failed) */\n success: boolean;\n /** Whether the review document was updated */\n reviewDocumentUpdated: boolean;\n /** Issue bodies that were updated */\n issuesUpdated?: Array<{ issueNumber: number; appliedDecisions: number }>;\n /** Summary counts */\n summary: {\n accepted: number;\n deferred: number;\n rejected: number;\n issuesModified?: number;\n };\n /** Warnings (e.g., vague defer targets) */\n warnings?: string[];\n /** Error if complete failure */\n error?: string;\n}\n\n// ============================================================================\n// Enhanced Party Review Types (3-Phase Architecture)\n// ============================================================================\n\n/**\n * BMAD agent types that can participate in party review\n */\nexport type BmadAgentType =\n | \"architect\"\n | \"dev\"\n | \"tea\"\n | \"pm\"\n | \"analyst\"\n | \"ux-designer\"\n | \"tech-writer\"\n | \"sm\";\n\n/**\n * BMAD agent persona details\n */\nexport interface BmadAgentPersona {\n type: BmadAgentType;\n name: string;\n title: string;\n expertise: string[];\n perspective: string;\n}\n\n/**\n * Mapping of BMAD agents with their personas\n */\nexport const BMAD_AGENTS: Record<BmadAgentType, BmadAgentPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n },\n};\n\n/**\n * Agent recommendation with reasoning\n */\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\n/**\n * Cross-story pattern identified by an agent\n */\nexport interface CrossStoryPattern {\n id?: string;\n pattern: string;\n affectedStories: string[];\n severity?: FindingSeverity;\n recommendation: string;\n}\n\n/**\n * Single agent's analysis output (Phase 2)\n */\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n agentName?: string;\n analyzedAt?: string;\n storiesAnalyzed?: string[];\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: CrossStoryPattern[];\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\n/**\n * Phase 1 context: Prepared by tool for Oracle invocation (before Oracle runs)\n */\nexport type Phase1Context = Phase1ContextSuccess | Phase1ContextError;\n\nexport interface Phase1ContextSuccess {\n success: true;\n scope: ReviewScope;\n identifier: string;\n reviewsDir: string;\n storiesContent: Array<{ id: string; content: string | null }>;\n architectureContent: string;\n oraclePrompt: string;\n selectedModel: string;\n complexity?: IssueComplexity;\n existingReviews?: ReviewDocumentReference[];\n}\n\nexport interface Phase1ContextError {\n success: false;\n scope: ReviewScope;\n identifier: string;\n error: string;\n suggestion?: string;\n}\n\n/**\n * Phase 1 summary: Minimal result returned to agent after Oracle analysis.\n * Large data (oracleAnalysis, storiesContent) is saved to file, not passed between tools.\n */\nexport interface Phase1Summary {\n success: boolean;\n scope: ReviewScope;\n identifier: string;\n error?: string;\n suggestion?: string;\n reviewFolderPath?: string;\n findings?: {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n };\n recommendedAgents?: AgentRecommendation[];\n summary?: string;\n}\n\n/**\n * Phase 1 full data: Complete data saved to analysis.json file.\n * Includes large fields that should not be passed between tool calls.\n */\nexport interface Phase1FullData extends Phase1Summary {\n storiesContent?: Array<{ id: string; title?: string; content: string | null }>;\n architectureContent?: string;\n oracleAnalysis?: string;\n}\n\n/**\n * @deprecated Use Phase1Summary for tool returns, Phase1FullData for file storage\n */\nexport type Phase1Result = Phase1FullData;\n\n/**\n * Phase 2 result: Aggregated agent analyses\n */\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface Phase2Result {\n success: boolean;\n identifier: string;\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n error?: string;\n}\n\n/**\n * Discussion context for Phase 3 party mode\n */\nexport interface DiscussionContext {\n scope: ReviewScope;\n identifier: string;\n issueIds: string[];\n phase1Summary: {\n totalFindings: number;\n highSeverity: number;\n reviewDocumentPath: string;\n };\n agentAnalyses: AgentAnalysis[];\n agendaItems: Array<{\n id: string;\n topic: string;\n type: \"consensus\" | \"debate\" | \"decision-needed\";\n relatedFindings: string[];\n agentPositions?: Record<BmadAgentType, string>;\n }>;\n preloadedContext: string;\n}\n\n/**\n * Final review session result\n */\nexport interface ReviewSessionResult {\n success: boolean;\n identifier: string;\n decisions: Record<string, ReviewDecision>;\n decisionSummary: {\n accepted: number;\n deferred: number;\n rejected: number;\n discussed: number;\n };\n issueUpdates: Array<{\n issueId: string;\n addedCriteria: string[];\n modifiedCriteria: string[];\n }>;\n actionItems: Array<{\n description: string;\n assignedTo?: BmadAgentType;\n deferredToIssue?: string;\n }>;\n sessionNotes: string;\n}\n\n// ============================================================================\n// Phase 3: Party Discussion Types\n// ============================================================================\n\n/**\n * Extended BMAD agent persona with full details from manifest\n */\nexport interface BmadAgentFullPersona extends BmadAgentPersona {\n icon: string;\n identity: string;\n communicationStyle: string;\n principles: string[];\n module?: string;\n}\n\n/**\n * Default full personas (fallback when BMAD manifest not available)\n */\nexport const BMAD_AGENT_FULL_PERSONAS: Record<BmadAgentType, BmadAgentFullPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n icon: \"🏗️\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n identity:\n \"Senior architect with expertise in distributed systems, cloud infrastructure, and API design. Specializes in scalable patterns and technology selection.\",\n communicationStyle:\n \"Speaks in calm, pragmatic tones, balancing 'what could be' with 'what should be.' Champions boring technology that actually works.\",\n principles: [\n \"User journeys drive technical decisions\",\n \"Embrace boring technology for stability\",\n \"Design simple solutions that scale when needed\",\n \"Developer productivity is architecture\",\n ],\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n icon: \"💻\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n identity:\n \"Elite developer who thrives on clean implementations. Lives for readable code, sensible abstractions, and solutions that actually work in production.\",\n communicationStyle:\n \"Ultra-succinct. Speaks in file paths and AC IDs - every statement citable. No fluff, all precision.\",\n principles: [\n \"Code should be readable by humans first\",\n \"Ship incrementally, validate continuously\",\n \"Tests are documentation\",\n \"Complexity is the enemy\",\n ],\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer Advocate\",\n icon: \"🧪\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n identity:\n \"Master test architect who sees quality as everyone's responsibility. Blends data with gut instinct to find bugs before they find users.\",\n communicationStyle:\n \"Blends data with gut instinct. 'Strong opinions, weakly held' is their mantra. Speaks in risk calculations and impact assessments.\",\n principles: [\n \"Test the behavior, not the implementation\",\n \"Edge cases reveal system character\",\n \"Automation enables confidence\",\n \"Quality is prevention, not detection\",\n ],\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n icon: \"📋\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n identity:\n \"Investigative product strategist who asks 'WHY?' relentlessly. Connects every feature to user value and business outcomes.\",\n communicationStyle:\n \"Asks 'WHY?' relentlessly like a detective on a case. Direct and data-sharp, cuts through fluff to what actually matters.\",\n principles: [\n \"User problems drive solutions\",\n \"Data informs, intuition guides\",\n \"MVP means minimum VIABLE\",\n \"Say no to protect yes\",\n ],\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n icon: \"📊\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n identity:\n \"Strategic analyst who treats requirements like treasure hunts. Excited by patterns, thrilled when ambiguity becomes clarity.\",\n communicationStyle:\n \"Treats analysis like a treasure hunt - excited by every clue, thrilled when patterns emerge. Asks questions that spark 'aha!' moments.\",\n principles: [\n \"Ambiguity is the enemy of delivery\",\n \"Edge cases reveal true requirements\",\n \"Stakeholders often know what they need, not what they want\",\n \"Document decisions, not just outcomes\",\n ],\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n icon: \"🎨\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n identity:\n \"User advocate who designs experiences, not just interfaces. Champions accessibility and believes good UX is invisible.\",\n communicationStyle:\n \"Empathetic and user-focused. Uses stories and scenarios to illustrate points. Gentle but firm on accessibility.\",\n principles: [\n \"Design for the edges, the middle takes care of itself\",\n \"Accessibility is not optional\",\n \"Users don't read, they scan\",\n \"Friction is the enemy of conversion\",\n ],\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n icon: \"📚\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n identity:\n \"Knowledge curator who makes complex simple. Believes documentation is a product feature, not an afterthought.\",\n communicationStyle:\n \"Patient educator who explains like teaching a friend. Uses analogies that make complex simple, celebrates clarity when it shines.\",\n principles: [\n \"If it's not documented, it doesn't exist\",\n \"Good docs prevent support tickets\",\n \"Examples are worth a thousand words\",\n \"Write for the reader, not the writer\",\n ],\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n icon: \"🎯\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n identity:\n \"Servant leader who removes blockers and protects team focus. Facilitates rather than dictates.\",\n communicationStyle:\n \"Facilitative and inclusive. Asks powerful questions rather than giving answers. Celebrates team wins.\",\n principles: [\n \"The team knows best\",\n \"Process serves people, not vice versa\",\n \"Blockers are opportunities for improvement\",\n \"Sustainable pace enables sustainable delivery\",\n ],\n },\n};\n\n/**\n * Input for the party discussion tool\n */\nexport interface PartyDiscussionInput {\n /** Phase 1 results with Oracle findings */\n phase1Result: Phase1Result;\n /** Phase 2 agent analyses */\n phase2Result: Phase2Result;\n /** Stories content for context */\n storiesContent: Array<{ id: string; content: string }>;\n /** Optional: specific findings to discuss (defaults to all high severity + disputed) */\n findingsToDiscuss?: string[];\n}\n\n/**\n * A single agent's response in a discussion round\n */\nexport interface AgentDiscussionResponse {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n response: string;\n /** References to other agents in cross-talk */\n references?: Array<{\n agent: BmadAgentType;\n type: \"agrees\" | \"disagrees\" | \"builds-on\" | \"questions\";\n }>;\n /** Key points extracted from response */\n keyPoints: string[];\n}\n\n/**\n * A complete discussion round for a single finding\n */\nexport interface DiscussionRound {\n findingId: string;\n findingTitle: string;\n findingSeverity: FindingSeverity;\n findingCategory: FindingCategory;\n /** Agents who participated in this round */\n participants: BmadAgentType[];\n /** Agent responses in order */\n responses: AgentDiscussionResponse[];\n /** User's decision for this finding */\n decision?: ReviewDecision;\n /** User's reasoning for the decision */\n decisionReason?: string;\n /** If deferred, where to */\n deferredTo?: string;\n}\n\n/**\n * Discussion agenda item\n */\nexport interface DiscussionAgendaItem {\n id: string;\n findingId: string;\n topic: string;\n type: \"high-severity\" | \"disputed\" | \"cross-story\" | \"consensus\";\n severity: FindingSeverity;\n category: FindingCategory;\n /** Agents relevant to this topic */\n relevantAgents: BmadAgentType[];\n /** Pre-existing agent positions from Phase 2 */\n agentPositions: Partial<Record<BmadAgentType, string>>;\n /** Whether this item has been discussed */\n discussed: boolean;\n /** The discussion round if discussed */\n round?: DiscussionRound;\n}\n\n/**\n * Current state of the party discussion\n */\nexport interface PartyDiscussionState {\n /** Unique session ID */\n sessionId: string;\n /** Review scope */\n scope: ReviewScope;\n /** Epic or story identifier */\n identifier: string;\n /** Current agenda items */\n agenda: DiscussionAgendaItem[];\n /** Index of current agenda item */\n currentItemIndex: number;\n /** Completed discussion rounds */\n completedRounds: DiscussionRound[];\n /** Participating agents for this session */\n activeAgents: BmadAgentType[];\n /** When the discussion started */\n startedAt: string;\n /** Phase data for context */\n phase1Summary: Phase1Result[\"findings\"];\n phase2Summary?: {\n consensusCount: number;\n disputeCount: number;\n };\n}\n\n/**\n * Result from the party discussion tool\n */\nexport interface PartyDiscussionResult {\n success: boolean;\n /** Session ID for continuation */\n sessionId: string;\n /** Current state of the discussion */\n state: PartyDiscussionState;\n /** Current agenda item to display */\n currentItem?: DiscussionAgendaItem;\n /** Agent responses for current item (if generating discussion) */\n currentResponses?: AgentDiscussionResponse[];\n /** Summary when discussion is complete */\n summary?: {\n totalDiscussed: number;\n decisions: {\n accepted: number;\n deferred: number;\n rejected: number;\n pending: number;\n };\n /** Issue updates implied by decisions */\n issueUpdatesNeeded: Array<{\n issueId: string;\n additions: string[];\n }>;\n };\n /** Result of automatically applying decisions to issues (on \"end\" action) */\n appliedUpdates?: ApplyDecisionsResult;\n /** Whether more items remain */\n hasMoreItems: boolean;\n /** Error if failed */\n error?: string;\n /** Suggestion for resolving error */\n suggestion?: string;\n}\n\n/**\n * Action to take in party discussion\n */\nexport type PartyDiscussionAction =\n | { type: \"start\"; input: PartyDiscussionInput }\n | { type: \"continue\"; sessionId: string }\n | {\n type: \"decide\";\n sessionId: string;\n findingId: string;\n decision: ReviewDecision;\n reason?: string;\n deferredTo?: string;\n }\n | { type: \"skip\"; sessionId: string; findingId: string }\n | { type: \"end\"; sessionId: string };\n\n// ============================================================================\n// Todo Sync Types\n// ============================================================================\n\n/**\n * OpenCode todo item format (matches oh-my-opencode/OpenCode schema)\n */\nexport interface OpenCodeTodo {\n /** Unique identifier for the todo item */\n id: string;\n /** Brief description of the task */\n content: string;\n /** Current status of the task */\n status: TodoStatus;\n /** Priority level of the task */\n priority: TodoPriority;\n}\n\n/**\n * Valid todo status values\n */\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n\n/**\n * Valid todo priority values\n */\nexport type TodoPriority = \"high\" | \"medium\" | \"low\";\n\n/**\n * Parsed todo ID components\n */\nexport interface ParsedTodoId {\n /** Issue number (e.g., 42) */\n issueNumber: number;\n /** Section token from todo ID */\n section: string;\n /** Line number hint (may have shifted) */\n lineHint: number;\n}\n\n/**\n * Match type for todo matching\n */\nexport type TodoMatchType = \"id\" | \"exact-content\" | \"similar-content\" | \"none\";\n\n/**\n * Confidence thresholds for todo matching\n */\nexport const TODO_MATCH_THRESHOLDS = {\n AUTO_UPDATE: 0.7,\n WARN_USER: 0.5,\n} as const;\n\n/**\n * Result of attempting to match a todo with a previous todo\n */\nexport interface TodoMatchResult {\n /** The matched todo, if any */\n matched: OpenCodeTodo | null;\n /** How the match was found */\n matchType: TodoMatchType;\n /** Confidence score (0-1) */\n confidence: number;\n}\n\n// ============================================================================\n// Story Complexity & Decomposition Types\n// ============================================================================\n\n/**\n * Effort level for a task (maps to Fibonacci-ish points)\n */\nexport type TaskEffortLevel = \"trivial\" | \"small\" | \"medium\" | \"large\" | \"xlarge\";\n\n/**\n * Points mapping for effort levels\n */\nexport const EFFORT_POINTS: Record<TaskEffortLevel, number> = {\n trivial: 1,\n small: 2,\n medium: 3,\n large: 5,\n xlarge: 8,\n};\n\n/**\n * A parsed subtask from a story file\n */\nexport interface ParsedSubtask {\n /** Subtask ID within task (e.g., \"1.1\", \"1.2\") */\n id: string;\n /** Subtask description */\n description: string;\n /** Whether the checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * A parsed task from a story file\n */\nexport interface ParsedTask {\n /** Task ID (e.g., \"1\", \"2\", \"3\") */\n id: string;\n /** Task description */\n description: string;\n /** Subtasks belonging to this task */\n subtasks: ParsedSubtask[];\n /** Whether the main task checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * Effort estimate for a single task\n */\nexport interface TaskEffortEstimate {\n /** Task ID */\n taskId: string;\n /** Task description */\n description: string;\n /** Estimated effort level */\n effort: TaskEffortLevel;\n /** Story points (1, 2, 3, 5, 8) */\n points: number;\n /** Signals that contributed to this estimate */\n signals: string[];\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { BmadAgentFullPersona, BmadAgentType } from \"../../shared/types.js\";\nimport { BMAD_AGENT_FULL_PERSONAS } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"persona-loader\");\n\ninterface BmadAgentYaml {\n agent: {\n metadata: {\n id: string;\n name: string;\n title: string;\n icon: string;\n module?: string;\n };\n persona: {\n role: string;\n identity: string;\n communication_style: string;\n principles: string;\n };\n };\n}\n\nfunction filenameToAgentType(filename: string): BmadAgentType | null {\n const base = basename(filename, \".agent.yaml\");\n\n const typeMap: Record<string, BmadAgentType> = {\n analyst: \"analyst\",\n architect: \"architect\",\n dev: \"dev\",\n pm: \"pm\",\n sm: \"sm\",\n tea: \"tea\",\n \"tech-writer\": \"tech-writer\",\n \"ux-designer\": \"ux-designer\",\n };\n\n return typeMap[base] || null;\n}\n\nfunction parsePrinciples(principlesText: string): string[] {\n const lines = principlesText\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n return lines\n .filter((line) => line.startsWith(\"-\"))\n .map((line) => line.substring(1).trim())\n .filter(Boolean);\n}\n\n/**\n * Parse a BMAD agent YAML file into a persona object.\n *\n * YAML-to-TypeScript field mappings:\n * - agent.persona.role → persona.perspective\n * - agent.persona.communication_style → persona.communicationStyle\n *\n * Falls back to built-in personas for missing or invalid fields.\n */\nasync function parseAgentYaml(\n filePath: string\n): Promise<{ type: BmadAgentType; persona: BmadAgentFullPersona } | null> {\n const agentType = filenameToAgentType(filePath);\n if (!agentType) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const data = parseYaml(content) as BmadAgentYaml;\n\n if (!data?.agent?.metadata || !data?.agent?.persona) {\n return null;\n }\n\n const { metadata, persona: personaData } = data.agent;\n const fallback = BMAD_AGENT_FULL_PERSONAS[agentType];\n\n const principles = personaData.principles\n ? parsePrinciples(personaData.principles)\n : fallback.principles;\n\n const persona: BmadAgentFullPersona = {\n type: agentType,\n name: metadata.name || fallback.name,\n title: metadata.title || fallback.title,\n icon: metadata.icon || fallback.icon,\n expertise: fallback.expertise,\n perspective: personaData.role || fallback.perspective,\n identity: personaData.identity || fallback.identity,\n communicationStyle: personaData.communication_style || fallback.communicationStyle,\n principles,\n };\n\n return { type: agentType, persona };\n } catch (error) {\n log.warn(\"Failed to parse agent YAML file\", {\n filePath,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n return null;\n }\n}\n\nasync function loadFromYamlFiles(\n agentFiles: string[]\n): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n const personas = new Map<BmadAgentType, BmadAgentFullPersona>();\n\n for (const filePath of agentFiles) {\n const result = await parseAgentYaml(filePath);\n if (result) {\n personas.set(result.type, result.persona);\n }\n }\n\n return personas;\n}\n\nexport async function loadPersonas(): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n return new Map(\n Object.entries(BMAD_AGENT_FULL_PERSONAS) as [BmadAgentType, BmadAgentFullPersona][]\n );\n}\n\nexport function getPersona(\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n agentType: BmadAgentType\n): BmadAgentFullPersona {\n return personas.get(agentType) || BMAD_AGENT_FULL_PERSONAS[agentType];\n}\n\nexport function selectAgentsForFinding(category: string, severity: string): BmadAgentType[] {\n const agents: BmadAgentType[] = [];\n\n switch (category) {\n case \"security\":\n agents.push(\"architect\", \"dev\", \"tea\");\n break;\n case \"logic\":\n agents.push(\"dev\", \"tea\", \"analyst\");\n break;\n case \"performance\":\n agents.push(\"architect\", \"dev\");\n break;\n case \"bestPractices\":\n agents.push(\"dev\", \"tech-writer\");\n break;\n default:\n agents.push(\"dev\", \"architect\");\n }\n\n if (severity === \"high\" && !agents.includes(\"pm\")) {\n agents.push(\"pm\");\n }\n\n return agents.slice(0, 3);\n}\n\nexport function buildAgentSystemPrompt(\n persona: BmadAgentFullPersona,\n phase2Analysis?: string\n): string {\n const principlesList = persona.principles.map((p) => `- ${p}`).join(\"\\n\");\n\n let prompt = `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Identity**:\n${persona.identity}\n\n**Your Communication Style**:\n${persona.communicationStyle}\n\n**Your Principles**:\n${principlesList}\n\n**Response Guidelines**:\n- Stay in character as ${persona.name}\n- Speak from your ${persona.perspective} perspective\n- Be concise but substantive (2-4 sentences per point)\n- Reference other agents by name when building on or disagreeing with their points\n- Use your icon ${persona.icon} at the start of your responses`;\n\n if (phase2Analysis) {\n prompt += `\n\n**Your Previous Analysis** (from Phase 2):\n${phase2Analysis}\n\nUse your previous analysis to inform this discussion. You already have context on these findings.`;\n }\n\n return prompt;\n}\n\nexport const _testExports = {\n filenameToAgentType,\n parsePrinciples,\n parseAgentYaml,\n loadFromYamlFiles,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentDiscussionResponse,\n BmadAgentFullPersona,\n BmadAgentType,\n DiscussionAgendaItem,\n DiscussionRound,\n FindingCategory,\n FindingSeverity,\n PartyDiscussionResult,\n PartyDiscussionState,\n Phase1FullData,\n Phase2Result,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { applyIssueDecisions } from \"../utils/issue-review-updater.js\";\nimport { extractAllFindings, parseOracleResponse } from \"../utils/oracle-parser.js\";\nimport { getPersona, loadPersonas, selectAgentsForFinding } from \"../utils/persona-loader.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"party-discussion\");\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_SESSIONS = 10;\n\ninterface SessionWithMeta {\n state: PartyDiscussionState;\n lastAccessedAt: number;\n reviewFolderPath?: string;\n phase2?: Phase2Result;\n}\n\nconst activeSessions = new Map<string, SessionWithMeta>();\n\nfunction cleanupStaleSessions(): void {\n const now = Date.now();\n const sessionsToDelete: string[] = [];\n\n for (const [id, session] of activeSessions) {\n if (now - session.lastAccessedAt > SESSION_TTL_MS) {\n sessionsToDelete.push(id);\n }\n }\n\n for (const id of sessionsToDelete) {\n activeSessions.delete(id);\n }\n\n const capacityThreshold = Math.ceil(MAX_SESSIONS * 0.8);\n if (activeSessions.size >= capacityThreshold && activeSessions.size < MAX_SESSIONS) {\n log.warn(\"Party discussion session capacity warning\", {\n currentSessions: activeSessions.size,\n maxSessions: MAX_SESSIONS,\n utilizationPercent: Math.round((activeSessions.size / MAX_SESSIONS) * 100),\n message: \"Approaching session limit. Oldest sessions will be evicted when limit is reached.\",\n });\n }\n\n if (activeSessions.size > MAX_SESSIONS) {\n const sortedSessions = Array.from(activeSessions.entries()).sort(\n (a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt\n );\n\n const toRemove = sortedSessions.slice(0, activeSessions.size - MAX_SESSIONS);\n for (const [id] of toRemove) {\n activeSessions.delete(id);\n }\n }\n}\n\nfunction getSession(sessionId: string): PartyDiscussionState | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session.state;\n}\n\nfunction getSessionWithMeta(sessionId: string): SessionWithMeta | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session;\n}\n\nfunction setSession(\n state: PartyDiscussionState,\n reviewFolderPath?: string,\n phase2?: Phase2Result\n): void {\n activeSessions.set(state.sessionId, {\n state,\n lastAccessedAt: Date.now(),\n reviewFolderPath,\n phase2,\n });\n}\n\nfunction buildAgenda(phase1: Phase1FullData, phase2?: Phase2Result): DiscussionAgendaItem[] {\n const agenda: DiscussionAgendaItem[] = [];\n\n const highSeverityFindings = extractHighSeverityFindings(phase1);\n for (const finding of highSeverityFindings) {\n const agentPositions = phase2 ? getAgentPositionsForFinding(finding.id, phase2) : {};\n agenda.push({\n id: `agenda-${finding.id}`,\n findingId: finding.id,\n topic: finding.title,\n type: \"high-severity\",\n severity: finding.severity,\n category: finding.category,\n relevantAgents: selectAgentsForFinding(finding.category, finding.severity),\n agentPositions,\n discussed: false,\n });\n }\n\n if (phase2) {\n for (const debate of phase2.debatePoints) {\n const existingItem = agenda.find((a) => a.topic === debate.topic);\n if (!existingItem) {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n for (const pos of debate.positions) {\n positions[pos.agent] = pos.position;\n }\n agenda.push({\n id: `agenda-debate-${agenda.length}`,\n findingId: `debate-${agenda.length}`,\n topic: debate.topic,\n type: \"disputed\",\n severity: \"medium\",\n category: \"logic\",\n relevantAgents: debate.positions.map((p) => p.agent),\n agentPositions: positions,\n discussed: false,\n });\n }\n }\n }\n\n return agenda;\n}\n\ninterface FindingInfo {\n id: string;\n title: string;\n severity: FindingSeverity;\n category: FindingCategory;\n}\n\nfunction extractHighSeverityFindings(phase1: Phase1FullData): FindingInfo[] {\n const highCount = phase1.findings?.high ?? 0;\n\n // Handle missing oracleAnalysis gracefully\n if (!phase1.oracleAnalysis) {\n // Fallback to placeholder findings based on count\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n return [];\n }\n\n // Use proper JSON parsing from oracle-parser\n const parsed = parseOracleResponse(phase1.oracleAnalysis);\n const allFindings = extractAllFindings(parsed);\n const highFindings = allFindings.filter((f) => f.severity === \"high\");\n\n if (highFindings.length > 0) {\n return highFindings.map((f, i) => ({\n id: f.id || `high-${i + 1}`,\n title: f.title,\n severity: \"high\" as const,\n category: f.category,\n }));\n }\n\n // Fallback if parsing didn't find high findings but count says otherwise\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n\n return [];\n}\n\nfunction inferCategory(title: string): FindingCategory {\n const lower = title.toLowerCase();\n if (lower.includes(\"security\") || lower.includes(\"auth\") || lower.includes(\"pii\")) {\n return \"security\";\n }\n if (lower.includes(\"performance\") || lower.includes(\"query\") || lower.includes(\"cache\")) {\n return \"performance\";\n }\n if (lower.includes(\"test\") || lower.includes(\"pattern\") || lower.includes(\"practice\")) {\n return \"bestPractices\";\n }\n return \"logic\";\n}\n\nfunction getAgentPositionsForFinding(\n findingId: string,\n phase2: Phase2Result\n): Partial<Record<BmadAgentType, string>> {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n\n for (const analysis of phase2.agentAnalyses) {\n const prioritized = analysis.prioritizedIssues.find((p) =>\n p.findingId.toLowerCase().includes(findingId.toLowerCase())\n );\n if (prioritized) {\n positions[analysis.agent] = `${prioritized.agentPriority}: ${prioritized.rationale}`;\n } else if (analysis.findings.concerns.length > 0) {\n positions[analysis.agent] = analysis.findings.concerns[0];\n }\n }\n\n return positions;\n}\n\nfunction initializeSession(\n phase1: Phase1FullData,\n phase2?: Phase2Result,\n reviewFolderPath?: string\n): PartyDiscussionState {\n const sessionId = randomUUID();\n const agenda = buildAgenda(phase1, phase2);\n\n const activeAgents = new Set<BmadAgentType>();\n for (const item of agenda) {\n for (const agent of item.relevantAgents) {\n activeAgents.add(agent);\n }\n }\n\n const state: PartyDiscussionState = {\n sessionId,\n scope: phase1.scope,\n identifier: phase1.identifier,\n agenda,\n currentItemIndex: 0,\n completedRounds: [],\n activeAgents: Array.from(activeAgents),\n startedAt: new Date().toISOString(),\n phase1Summary: phase1.findings ?? {\n total: 0,\n high: 0,\n medium: 0,\n low: 0,\n byCategory: {} as Record<FindingCategory, number>,\n },\n phase2Summary: phase2\n ? {\n consensusCount: phase2.consensusPoints.length,\n disputeCount: phase2.debatePoints.length,\n }\n : undefined,\n };\n\n setSession(state, reviewFolderPath, phase2);\n return state;\n}\n\nasync function generateAgentResponses(\n item: DiscussionAgendaItem,\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n phase2?: Phase2Result\n): Promise<AgentDiscussionResponse[]> {\n const responses: AgentDiscussionResponse[] = [];\n\n for (const agentType of item.relevantAgents) {\n const persona = getPersona(personas, agentType);\n\n const phase2Analysis = phase2?.agentAnalyses.find((a) => a.agent === agentType);\n const previousPosition = item.agentPositions[agentType];\n\n const response = generateInCharacterResponse(\n persona,\n item,\n previousPosition,\n phase2Analysis?.summary,\n responses\n );\n\n responses.push({\n agent: agentType,\n agentName: persona.name,\n icon: persona.icon,\n response,\n references: extractReferences(response, responses),\n keyPoints: extractKeyPoints(response),\n });\n }\n\n return responses;\n}\n\nfunction generateInCharacterResponse(\n persona: BmadAgentFullPersona,\n item: DiscussionAgendaItem,\n previousPosition?: string,\n phase2Summary?: string,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n const intro = getResponseIntro(persona, item);\n const position = previousPosition || phase2Summary || getDefaultPosition(persona, item);\n const crossTalk = generateCrossTalk(persona, previousResponses);\n\n return `${intro} ${position}${crossTalk}`;\n}\n\nfunction getResponseIntro(persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n const intros: Record<BmadAgentType, string> = {\n architect: `From an architecture perspective on \"${item.topic}\":`,\n dev: `Looking at implementation for \"${item.topic}\":`,\n tea: `From a testing standpoint on \"${item.topic}\":`,\n pm: `Considering business impact of \"${item.topic}\":`,\n analyst: `Analyzing requirements around \"${item.topic}\":`,\n \"ux-designer\": `From a user experience view on \"${item.topic}\":`,\n \"tech-writer\": `Regarding documentation for \"${item.topic}\":`,\n sm: `From a process perspective on \"${item.topic}\":`,\n };\n\n return intros[persona.type] || `Regarding \"${item.topic}\":`;\n}\n\nfunction getDefaultPosition(_persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n if (item.severity === \"high\") {\n return `This is a ${item.severity} severity ${item.category} issue that needs attention before we proceed.`;\n }\n return `This ${item.category} concern should be addressed to maintain quality.`;\n}\n\nfunction generateCrossTalk(\n persona: BmadAgentFullPersona,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n if (!previousResponses || previousResponses.length === 0) return \"\";\n\n const collaborativeTypes: BmadAgentType[] = [\"architect\", \"pm\", \"analyst\"];\n const shouldCrossTalk =\n previousResponses.length >= 1 && collaborativeTypes.includes(persona.type);\n\n if (shouldCrossTalk) {\n const lastResponse = previousResponses[previousResponses.length - 1];\n return ` Building on ${lastResponse.agentName}'s point, I'd add that we should prioritize this appropriately.`;\n }\n return \"\";\n}\n\nfunction extractReferences(\n response: string,\n previousResponses: AgentDiscussionResponse[]\n): AgentDiscussionResponse[\"references\"] {\n const references: AgentDiscussionResponse[\"references\"] = [];\n\n for (const prev of previousResponses) {\n if (response.includes(prev.agentName)) {\n const type = response.toLowerCase().includes(\"disagree\")\n ? \"disagrees\"\n : response.toLowerCase().includes(\"building on\")\n ? \"builds-on\"\n : \"agrees\";\n references.push({ agent: prev.agent, type });\n }\n }\n\n return references;\n}\n\nfunction extractKeyPoints(response: string): string[] {\n const sentences = response.split(/[.!?]+/).filter((s) => s.trim().length > 10);\n return sentences.slice(0, 2).map((s) => s.trim());\n}\n\nfunction recordDecision(\n state: PartyDiscussionState,\n findingId: string,\n decision: ReviewDecision,\n reason?: string,\n deferredTo?: string\n): PartyDiscussionState {\n const itemIndex = state.agenda.findIndex((a) => a.findingId === findingId);\n if (itemIndex === -1) return state;\n\n const item = state.agenda[itemIndex];\n item.discussed = true;\n\n const round: DiscussionRound = {\n findingId,\n findingTitle: item.topic,\n findingSeverity: item.severity,\n findingCategory: item.category,\n participants: item.relevantAgents,\n responses: [],\n decision,\n decisionReason: reason,\n deferredTo,\n };\n\n item.round = round;\n state.completedRounds.push(round);\n\n if (state.currentItemIndex === itemIndex) {\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return state;\n}\n\nfunction findNextUndiscussedIndex(state: PartyDiscussionState): number {\n for (let i = 0; i < state.agenda.length; i++) {\n if (!state.agenda[i].discussed) {\n return i;\n }\n }\n return state.agenda.length;\n}\n\nfunction calculateSummary(state: PartyDiscussionState): PartyDiscussionResult[\"summary\"] {\n const decisions = { accepted: 0, deferred: 0, rejected: 0, pending: 0 };\n const issueUpdates = new Map<string, string[]>();\n\n for (const round of state.completedRounds) {\n switch (round.decision) {\n case \"accept\":\n decisions.accepted++;\n break;\n case \"defer\":\n decisions.deferred++;\n if (round.deferredTo) {\n const existing = issueUpdates.get(round.deferredTo) || [];\n existing.push(`Deferred: ${round.findingTitle}`);\n issueUpdates.set(round.deferredTo, existing);\n }\n break;\n case \"reject\":\n decisions.rejected++;\n break;\n default:\n decisions.pending++;\n }\n }\n\n for (const item of state.agenda) {\n if (!item.discussed) {\n decisions.pending++;\n }\n }\n\n return {\n totalDiscussed: state.completedRounds.length,\n decisions,\n issueUpdatesNeeded: Array.from(issueUpdates.entries()).map(([issueId, additions]) => ({\n issueId,\n additions,\n })),\n };\n}\n\nexport function createPartyDiscussionTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Orchestrate Phase 3 party discussion for issue reviews.\n\nThis tool manages an informed discussion where expert agents debate findings from Phase 1 (Oracle analysis) and optionally Phase 2 (parallel agent analysis).\n\nModes:\n- Quick mode: Only analysis.json exists in review folder (Oracle findings only)\n- Full mode: Both analysis.json and phase2.json exist (includes agent perspectives)\n\nActions:\n- start: Initialize discussion from review folder (loads analysis.json and optionally phase2.json)\n- continue: Get next agenda item and agent responses\n- decide: Record user decision for a finding (accept/defer/reject)\n- skip: Skip current finding without decision\n- end: End discussion and get summary\n\nThe tool maintains session state across calls, enabling multi-turn discussion.`,\n\n args: {\n action: tool.schema\n .enum([\"start\", \"continue\", \"decide\", \"skip\", \"end\"])\n .describe(\"Action to perform\"),\n sessionId: tool.schema\n .string()\n .optional()\n .describe(\"Session ID (required for continue/decide/skip/end)\"),\n reviewFolderPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to review folder from sdlc_story_review_analyze (required for start)\"),\n findingId: tool.schema.string().optional().describe(\"Finding ID (required for decide)\"),\n decision: tool.schema\n .enum([\"accept\", \"defer\", \"reject\"])\n .optional()\n .describe(\"Decision (required for decide)\"),\n reason: tool.schema.string().optional().describe(\"Reason for decision\"),\n deferredTo: tool.schema\n .string()\n .optional()\n .describe(\"Issue note to defer to (for defer decisions)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyDiscussion(ctx, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\ninterface ToolArgs {\n action: \"start\" | \"continue\" | \"decide\" | \"skip\" | \"end\";\n sessionId?: string;\n reviewFolderPath?: string;\n findingId?: string;\n decision?: \"accept\" | \"defer\" | \"reject\";\n reason?: string;\n deferredTo?: string;\n}\n\nasync function executePartyDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ToolArgs\n): Promise<PartyDiscussionResult> {\n cleanupStaleSessions();\n const personas = await loadPersonas();\n\n switch (args.action) {\n case \"start\": {\n if (!args.reviewFolderPath) {\n log.warn(\"start called without reviewFolderPath\");\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"reviewFolderPath is required for start action\",\n suggestion: \"Pass the reviewFolderPath from sdlc_story_review_analyze result\",\n };\n }\n\n const analysisPath = join(args.reviewFolderPath, \"analysis.json\");\n const phase2Path = join(args.reviewFolderPath, \"phase2.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n let phase2: Phase2Result | undefined;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n\n if (existsSync(phase2Path)) {\n const phase2Content = await readFile(phase2Path, \"utf-8\");\n phase2 = JSON.parse(phase2Content);\n }\n } catch (e) {\n log.error(\"Failed to load review files\", {\n error: e instanceof Error ? e.message : String(e),\n reviewFolderPath: args.reviewFolderPath,\n });\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Failed to load review files: ${e instanceof Error ? e.message : String(e)}`,\n suggestion: \"Ensure the review folder contains valid analysis.json\",\n };\n }\n\n if (!phase1.findings) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"analysis.json missing required 'findings' field\",\n suggestion: \"Ensure sdlc_story_review_analyze completed successfully\",\n };\n }\n\n if (!phase1.oracleAnalysis && phase1.findings.high > 0) {\n console.warn(\n \"[Sdlc] analysis.json missing oracleAnalysis field - using placeholder findings for\",\n phase1.identifier\n );\n }\n\n const state = initializeSession(phase1, phase2, args.reviewFolderPath);\n log.info(\"Session started\", {\n sessionId: state.sessionId,\n identifier: state.identifier,\n agendaItems: state.agenda.length,\n hasPhase2: !!phase2,\n });\n\n const currentItem = state.agenda[0];\n const responses = currentItem\n ? await generateAgentResponses(currentItem, personas, phase2)\n : undefined;\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem,\n currentResponses: responses,\n hasMoreItems: state.agenda.length > 1,\n };\n }\n\n case \"continue\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for continue action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const currentItem = state.agenda[state.currentItemIndex];\n if (!currentItem || currentItem.discussed) {\n const nextIndex = findNextUndiscussedIndex(state);\n if (nextIndex >= state.agenda.length) {\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: calculateSummary(state),\n };\n }\n state.currentItemIndex = nextIndex;\n }\n\n const nextItem = state.agenda[state.currentItemIndex];\n const phase2 = getSessionWithMeta(state.sessionId)?.phase2;\n\n const responses = await generateAgentResponses(nextItem, personas, phase2);\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem: nextItem,\n currentResponses: responses,\n hasMoreItems: state.currentItemIndex < state.agenda.length - 1,\n };\n }\n\n case \"decide\": {\n if (!args.sessionId || !args.findingId || !args.decision) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId, findingId, and decision are required for decide action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const updatedState = recordDecision(\n state,\n args.findingId,\n args.decision,\n args.reason,\n args.deferredTo\n );\n log.debug(\"Decision recorded\", {\n sessionId: args.sessionId,\n findingId: args.findingId,\n decision: args.decision,\n });\n\n const hasMore = updatedState.currentItemIndex < updatedState.agenda.length;\n\n return {\n success: true,\n sessionId: updatedState.sessionId,\n state: updatedState,\n hasMoreItems: hasMore,\n summary: !hasMore ? calculateSummary(updatedState) : undefined,\n };\n }\n\n case \"skip\": {\n if (!args.sessionId || !args.findingId) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId and findingId are required for skip action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const itemIndex = state.agenda.findIndex((a) => a.findingId === args.findingId);\n if (itemIndex !== -1) {\n state.agenda[itemIndex].discussed = true;\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: state.currentItemIndex < state.agenda.length,\n };\n }\n\n case \"end\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for end action\",\n };\n }\n\n const sessionMeta = getSessionWithMeta(args.sessionId);\n if (!sessionMeta) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const state = sessionMeta.state;\n activeSessions.delete(args.sessionId);\n const endSummary = calculateSummary(state);\n\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n sessionId: args.sessionId,\n state,\n hasMoreItems: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const appliedUpdates = await applyIssueDecisions(ctx, config, state);\n\n log.info(\"Session ended with decisions applied\", {\n sessionId: args.sessionId,\n totalDiscussed: endSummary?.totalDiscussed ?? 0,\n decisions: endSummary?.decisions,\n issuesModified: appliedUpdates.summary.issuesModified ?? 0,\n });\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: endSummary,\n appliedUpdates,\n };\n }\n\n default:\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Unknown action: ${args.action}`,\n };\n }\n}\n\nexport const _testExports = {\n buildAgenda,\n extractHighSeverityFindings,\n inferCategory,\n getAgentPositionsForFinding,\n initializeSession,\n generateAgentResponses,\n recordDecision,\n calculateSummary,\n activeSessions,\n cleanupStaleSessions,\n getSession,\n getSessionWithMeta,\n setSession,\n SESSION_TTL_MS,\n MAX_SESSIONS,\n};\n","/**\n * sdlc_party_review Tool\n *\n * Architecture party review using BMAD personas.\n * Facilitates multi-stakeholder discussions on architectural decisions.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { BmadAgentFullPersona, BmadAgentType, SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport { loadPersonas } from \"../utils/persona-loader.js\";\n\n/**\n * Party review topic\n */\nexport interface ReviewTopic {\n title: string;\n description: string;\n context?: string;\n options?: string[];\n}\n\n/**\n * Agent perspective in review\n */\nexport interface AgentPerspective {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n perspective: string;\n concerns: string[];\n recommendations: string[];\n}\n\n/**\n * Party review result\n */\nexport interface PartyReviewResult {\n success: boolean;\n topic?: ReviewTopic;\n perspectives?: AgentPerspective[];\n synthesis?: string;\n documentPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_party_review tool\n */\nexport interface PartyReviewArgs {\n topic: string;\n description: string;\n context?: string;\n options?: string[];\n agents?: string[];\n}\n\n/**\n * BMAD Persona mapping\n */\nconst PERSONA_ROLES: Record<string, BmadAgentType> = {\n winston: \"architect\",\n architect: \"architect\",\n amelia: \"dev\",\n developer: \"dev\",\n dev: \"dev\",\n murat: \"tea\",\n tester: \"tea\",\n tea: \"tea\",\n john: \"pm\",\n \"product-manager\": \"pm\",\n pm: \"pm\",\n mary: \"analyst\",\n \"business-analyst\": \"analyst\",\n analyst: \"analyst\",\n sally: \"ux-designer\",\n \"ux-designer\": \"ux-designer\",\n ux: \"ux-designer\",\n paige: \"tech-writer\",\n \"tech-writer\": \"tech-writer\",\n writer: \"tech-writer\",\n bob: \"sm\",\n \"scrum-master\": \"sm\",\n sm: \"sm\",\n};\n\n/**\n * Default agents for architecture reviews\n */\nconst DEFAULT_ARCHITECTURE_AGENTS: BmadAgentType[] = [\n \"architect\", // Winston - architecture perspective\n \"dev\", // Amelia - implementation perspective\n \"tea\", // Murat - testing perspective\n \"pm\", // John - business/product perspective\n];\n\n/**\n * Create the sdlc_party_review tool\n */\nexport function createPartyReviewTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Conduct a party review for architectural decisions using BMAD personas.\n\nThis tool facilitates multi-stakeholder discussions where expert personas provide\ntheir perspectives on architectural topics, trade-offs, and decisions.\n\nAvailable personas:\n- Winston (architect) - System design, scalability, patterns\n- Amelia (dev) - Implementation, code quality, maintainability\n- Murat (tea) - Testing, quality assurance, edge cases\n- John (pm) - Business value, timeline, priorities\n- Mary (analyst) - Requirements, domain logic, user needs\n- Sally (ux-designer) - User experience, accessibility\n- Paige (tech-writer) - Documentation, clarity\n- Bob (sm) - Process, team dynamics, delivery\n\nBy default, architecture reviews include: Winston, Amelia, Murat, John.\nYou can specify custom agents for domain-specific discussions.\n\nReturns perspectives from each agent plus a synthesized summary.`,\n\n args: {\n topic: tool.schema.string().describe(\"The architectural topic or decision to discuss\"),\n description: tool.schema.string().describe(\"Detailed description of the topic or decision\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context (e.g., current architecture, constraints)\"),\n options: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Options being considered (if this is a decision point)\"),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\n \"Specific agents to include (e.g., ['winston', 'amelia']). Default: architecture team\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyReview(ctx, config, args as PartyReviewArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePartyReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: PartyReviewArgs\n): Promise<PartyReviewResult> {\n // Load personas\n const personas = await loadPersonas();\n\n // Determine which agents to include\n let agentTypes: BmadAgentType[] = DEFAULT_ARCHITECTURE_AGENTS;\n\n if (args.agents && args.agents.length > 0) {\n agentTypes = args.agents\n .map((a) => PERSONA_ROLES[a.toLowerCase()])\n .filter((t): t is BmadAgentType => t !== undefined);\n\n if (agentTypes.length === 0) {\n return {\n success: false,\n error: \"No valid agents specified\",\n suggestion: `Valid agents: ${Object.keys(PERSONA_ROLES).join(\", \")}`,\n };\n }\n }\n\n const topic: ReviewTopic = {\n title: args.topic,\n description: args.description,\n context: args.context,\n options: args.options,\n };\n\n // Gather perspectives from each agent\n const perspectives: AgentPerspective[] = [];\n\n for (const agentType of agentTypes) {\n const persona = personas.get(agentType);\n if (!persona) continue;\n\n const perspective = await gatherPerspective(ctx, config, persona, topic, perspectives);\n perspectives.push(perspective);\n }\n\n // Synthesize the discussion\n const synthesis = await synthesizeDiscussion(ctx, config, topic, perspectives);\n\n // Save review document\n const reviewId = randomUUID().slice(0, 8);\n const documentPath = join(ctx.directory, \".opencode\", \"reviews\", `party-review-${reviewId}.md`);\n\n try {\n await mkdir(dirname(documentPath), { recursive: true });\n await writeFile(documentPath, generateReviewDocument(topic, perspectives, synthesis), \"utf-8\");\n } catch {\n // Non-fatal\n }\n\n return {\n success: true,\n topic,\n perspectives,\n synthesis,\n documentPath,\n };\n}\n\nasync function gatherPerspective(\n ctx: PluginInput,\n config: SdlcConfig,\n persona: BmadAgentFullPersona,\n topic: ReviewTopic,\n previousPerspectives: AgentPerspective[]\n): Promise<AgentPerspective> {\n // Build prompt for this persona\n const previousContext =\n previousPerspectives.length > 0\n ? `\\n\\nPrevious perspectives shared:\\n${previousPerspectives\n .map((p) => `- ${p.agentName}: ${p.perspective.slice(0, 200)}...`)\n .join(\"\\n\")}`\n : \"\";\n\n const optionsSection = topic.options\n ? `\\n\\nOptions being considered:\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}`\n : \"\";\n\n const prompt = `You are ${persona.name}, the ${persona.title}.\n\n${persona.identity}\n\n## Topic for Review\n\n**${topic.title}**\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}` : \"\"}\n${optionsSection}\n${previousContext}\n\n## Your Task\n\nProvide your perspective on this architectural topic from your role as ${persona.title}.\n\nStructure your response as:\n\n### Perspective\n[Your main perspective on this topic - 2-3 paragraphs]\n\n### Concerns\n- [Concern 1]\n- [Concern 2]\n- [...]\n\n### Recommendations\n- [Recommendation 1]\n- [Recommendation 2]\n- [...]\n\nStay in character and focus on your area of expertise.`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review: ${persona.name}`,\n },\n });\n\n if (!createResult.data?.id) {\n return createFallbackPerspective(persona, topic);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return createFallbackPerspective(persona, topic);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return parseAgentResponse(persona, content);\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return createFallbackPerspective(persona, topic);\n }\n}\n\nfunction createFallbackPerspective(\n persona: BmadAgentFullPersona,\n topic: ReviewTopic\n): AgentPerspective {\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective: `As ${persona.title}, I would need to analyze \"${topic.title}\" more thoroughly to provide a complete perspective.`,\n concerns: [\"Further analysis needed\"],\n recommendations: [\"Schedule detailed review session\"],\n };\n}\n\nfunction parseAgentResponse(persona: BmadAgentFullPersona, content: string): AgentPerspective {\n // Extract perspective section\n const perspectiveMatch = content.match(\n /###?\\s*Perspective\\s*\\n+([\\s\\S]*?)(?=###?\\s*Concerns|$)/i\n );\n const perspective = perspectiveMatch ? perspectiveMatch[1].trim() : content.slice(0, 500);\n\n // Extract concerns\n const concernsMatch = content.match(\n /###?\\s*Concerns\\s*\\n+([\\s\\S]*?)(?=###?\\s*Recommendations|$)/i\n );\n const concerns: string[] = [];\n if (concernsMatch) {\n const items = concernsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n concerns.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n // Extract recommendations\n const recsMatch = content.match(/###?\\s*Recommendations\\s*\\n+([\\s\\S]*?)$/i);\n const recommendations: string[] = [];\n if (recsMatch) {\n const items = recsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n recommendations.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective,\n concerns: concerns.length > 0 ? concerns : [\"No specific concerns raised\"],\n recommendations: recommendations.length > 0 ? recommendations : [\"No specific recommendations\"],\n };\n}\n\nasync function synthesizeDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n topic: ReviewTopic,\n perspectives: AgentPerspective[]\n): Promise<string> {\n const perspectivesText = perspectives\n .map(\n (p) =>\n `## ${p.agentName} (${p.agent})\n${p.perspective}\n\n**Concerns:** ${p.concerns.join(\"; \")}\n\n**Recommendations:** ${p.recommendations.join(\"; \")}`\n )\n .join(\"\\n\\n\");\n\n const prompt = `Synthesize the following party review discussion into a cohesive summary.\n\n## Topic: ${topic.title}\n\n${topic.description}\n\n${topic.options ? `**Options considered:** ${topic.options.join(\", \")}` : \"\"}\n\n## Perspectives Gathered\n\n${perspectivesText}\n\n## Your Task\n\nWrite a synthesis that:\n1. Summarizes the key points of agreement\n2. Highlights areas of disagreement or tension\n3. Identifies the main trade-offs\n4. Provides a balanced recommendation (if applicable)\n\nKeep the synthesis concise (3-4 paragraphs).`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n return textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return generateFallbackSynthesis(perspectives);\n }\n}\n\nfunction generateFallbackSynthesis(perspectives: AgentPerspective[]): string {\n const allConcerns = perspectives.flatMap((p) => p.concerns);\n const allRecs = perspectives.flatMap((p) => p.recommendations);\n\n return `## Synthesis\n\nThe party review gathered perspectives from ${perspectives.length} stakeholders.\n\n**Key Concerns:**\n${allConcerns\n .slice(0, 5)\n .map((c) => `- ${c}`)\n .join(\"\\n\")}\n\n**Recommendations:**\n${allRecs\n .slice(0, 5)\n .map((r) => `- ${r}`)\n .join(\"\\n\")}\n\nFurther discussion may be needed to reach consensus.`;\n}\n\nfunction generateReviewDocument(\n topic: ReviewTopic,\n perspectives: AgentPerspective[],\n synthesis: string\n): string {\n const date = new Date().toISOString().split(\"T\")[0];\n\n let doc = `# Party Review: ${topic.title}\n\n**Date:** ${date}\n\n## Topic\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}\\n` : \"\"}\n${topic.options ? `### Options Considered\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}\\n` : \"\"}\n\n## Perspectives\n\n`;\n\n for (const p of perspectives) {\n doc += `### ${p.icon} ${p.agentName}\n\n${p.perspective}\n\n**Concerns:**\n${p.concerns.map((c) => `- ${c}`).join(\"\\n\")}\n\n**Recommendations:**\n${p.recommendations.map((r) => `- ${r}`).join(\"\\n\")}\n\n---\n\n`;\n }\n\n doc += `## Synthesis\n\n${synthesis}\n`;\n\n return doc;\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n executePartyReview,\n gatherPerspective,\n parseAgentResponse,\n synthesizeDiscussion,\n generateReviewDocument,\n PERSONA_ROLES,\n DEFAULT_ARCHITECTURE_AGENTS,\n};\n","/**\n * sdlc_review_pr Tool\n *\n * 3-stage Pull Request review:\n * - Stage 1: Specification Compliance\n * - Stage 2: Code Quality\n * - Stage 3: Domain Integrity\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Specification compliance status for an acceptance criterion\n */\nexport type SpecComplianceStatus =\n | \"COMPLETE\"\n | \"MISSING\"\n | \"INCOMPLETE\"\n | \"OVER-BUILT\"\n | \"DIVERGENT\";\n\n/**\n * Code quality flag severity\n */\nexport type QualityFlag = \"BUG_RISK\" | \"MAINTAINABILITY\" | \"STYLE\" | \"PERFORMANCE\";\n\n/**\n * Specification compliance finding\n */\nexport interface SpecComplianceFinding {\n issueNumber: number;\n acNumber: number;\n acText: string;\n status: SpecComplianceStatus;\n evidence?: string;\n}\n\n/**\n * Code quality finding\n */\nexport interface CodeQualityFinding {\n flag: QualityFlag;\n file: string;\n line?: number;\n description: string;\n suggestion?: string;\n}\n\n/**\n * Domain integrity violation\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"parse_validate\" | \"naming\";\n location: string;\n description: string;\n impact: string;\n recommendation: string;\n}\n\n/**\n * PR review result\n */\nexport interface PrReviewResult {\n success: boolean;\n prNumber: number;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\";\n mustFix: string[];\n shouldFix: string[];\n consider: string[];\n reviewPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_review_pr tool\n */\nexport interface ReviewPrArgs {\n prNumber: number;\n stages?: string;\n skipDomain?: boolean;\n}\n\n/**\n * Create the sdlc_review_pr tool\n */\nexport function createReviewPrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Perform a comprehensive 3-stage Pull Request review.\n\nStage 1: Specification Compliance\n- Maps each acceptance criterion to implementation\n- Flags: COMPLETE, MISSING, INCOMPLETE, OVER-BUILT, DIVERGENT\n\nStage 2: Code Quality\n- Evaluates clarity, domain types, error handling, testing, YAGNI\n- Flags: BUG_RISK, MAINTAINABILITY, STYLE, PERFORMANCE\n\nStage 3: Domain Integrity\n- Compile-time enforcement audit\n- Checks for primitive obsession, invalid states, parse-don't-validate\n\nReturns:\n- verdict: APPROVE | REQUEST_CHANGES | COMMENT\n- mustFix: Blocking issues\n- shouldFix: Non-blocking improvements\n- consider: Optional suggestions\n- reviewPath: Path to saved review document`,\n\n args: {\n prNumber: tool.schema.number().describe(\"GitHub Pull Request number to review\"),\n stages: tool.schema\n .string()\n .optional()\n .describe(\"Comma-separated stages to run (1,2,3). Default: all stages.\"),\n skipDomain: tool.schema\n .boolean()\n .optional()\n .describe(\"Skip Stage 3 domain integrity check (faster review)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeReview(ctx, config, args as ReviewPrArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ReviewPrArgs\n): Promise<PrReviewResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n // Determine which stages to run\n let stages: number[] = [1, 2, 3];\n if (args.stages) {\n stages = args.stages\n .split(\",\")\n .map((s) => Number.parseInt(s.trim(), 10))\n .filter((n) => [1, 2, 3].includes(n));\n } else if (args.skipDomain) {\n stages = [1, 2];\n }\n\n // Fetch PR information\n const prInfo = await fetchPrInfo(ctx, config, args.prNumber);\n if (!prInfo.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: prInfo.error,\n suggestion: prInfo.suggestion,\n };\n }\n\n // Build review prompt\n const reviewPrompt = await buildReviewPrompt(ctx, config, args.prNumber, prInfo, stages);\n\n // Spawn review agent\n const agentResult = await spawnReviewAgent(ctx, config, reviewPrompt, args.prNumber);\n\n if (!agentResult.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: agentResult.error || \"Review agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Parse the review output\n const parsed = parseReviewOutput(agentResult.content || \"\");\n\n // Save review document\n const reviewPath = join(ctx.directory, \".opencode\", \"reviews\", `pr-${args.prNumber}-review.md`);\n\n try {\n await mkdir(dirname(reviewPath), { recursive: true });\n await writeFile(reviewPath, agentResult.content || \"\", \"utf-8\");\n } catch {\n // Non-fatal - continue without saving\n }\n\n // Determine verdict based on findings\n const mustFix: string[] = [];\n const shouldFix: string[] = [];\n const consider: string[] = [];\n\n // Stage 1: MISSING is blocking\n if (parsed.stage1) {\n for (const finding of parsed.stage1.findings) {\n if (finding.status === \"MISSING\") {\n mustFix.push(`[MISSING] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"INCOMPLETE\" || finding.status === \"DIVERGENT\") {\n shouldFix.push(`[${finding.status}] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"OVER-BUILT\") {\n consider.push(`[OVER-BUILT] AC${finding.acNumber}: ${finding.acText}`);\n }\n }\n }\n\n // Stage 2: BUG_RISK is blocking\n if (parsed.stage2) {\n for (const finding of parsed.stage2.findings) {\n if (finding.flag === \"BUG_RISK\") {\n mustFix.push(`[BUG_RISK] ${finding.file}: ${finding.description}`);\n } else if (finding.flag === \"MAINTAINABILITY\" || finding.flag === \"PERFORMANCE\") {\n shouldFix.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n } else {\n consider.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n }\n }\n }\n\n // Stage 3: Domain violations are warnings unless severe\n if (parsed.stage3) {\n for (const violation of parsed.stage3.violations) {\n if (violation.type === \"invalid_state\") {\n shouldFix.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n } else {\n consider.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n }\n }\n }\n\n // Determine verdict\n let verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" = \"APPROVE\";\n if (mustFix.length > 0) {\n verdict = \"REQUEST_CHANGES\";\n } else if (shouldFix.length > 0) {\n verdict = \"COMMENT\";\n }\n\n return {\n success: true,\n prNumber: args.prNumber,\n filesChanged: prInfo.filesChanged,\n linesAdded: prInfo.linesAdded,\n linesRemoved: prInfo.linesRemoved,\n linkedIssues: prInfo.linkedIssues,\n stage1: parsed.stage1,\n stage2: parsed.stage2,\n stage3: parsed.stage3,\n verdict,\n mustFix,\n shouldFix,\n consider,\n reviewPath,\n };\n}\n\ninterface PrInfo {\n success: boolean;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n diff?: string;\n issueContext?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function fetchPrInfo(\n ctx: PluginInput,\n config: SdlcConfig,\n prNumber: number\n): Promise<PrInfo> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n const { owner, repo } = config.github;\n const repoPath = `${owner}/${repo}`;\n\n try {\n // Fetch PR details using gh CLI\n const { stdout: prStdout } =\n await ctx.$`gh pr view ${prNumber} --repo ${repoPath} --json additions,deletions,changedFiles,body,title`;\n\n const prData = JSON.parse(String(prStdout).trim());\n\n // Fetch PR diff\n let diff = \"\";\n try {\n const { stdout: diffStdout } = await ctx.$`gh pr diff ${prNumber} --repo ${repoPath}`;\n diff = String(diffStdout);\n } catch {\n // Diff fetch failed - continue without it\n }\n\n // Extract linked issues from PR body\n const linkedIssues: number[] = [];\n const issueMatches = prData.body?.matchAll(/(?:closes?|fixes?|resolves?)\\s*#(\\d+)/gi) || [];\n for (const match of issueMatches) {\n linkedIssues.push(Number.parseInt(match[1], 10));\n }\n\n // Also check for plain issue references\n const refMatches = prData.body?.matchAll(/#(\\d+)/g) || [];\n for (const match of refMatches) {\n const num = Number.parseInt(match[1], 10);\n if (!linkedIssues.includes(num)) {\n linkedIssues.push(num);\n }\n }\n\n // Fetch linked issue details for context\n let issueContext = \"\";\n for (const issueNum of linkedIssues.slice(0, 3)) {\n try {\n const { stdout: issueStdout } =\n await ctx.$`gh issue view ${issueNum} --repo ${repoPath} --json title,body`;\n const issueData = JSON.parse(String(issueStdout).trim());\n issueContext += `\\n\\n## Issue #${issueNum}: ${issueData.title}\\n\\n${issueData.body || \"\"}`;\n } catch {\n // Issue fetch failed - continue\n }\n }\n\n return {\n success: true,\n filesChanged: prData.changedFiles,\n linesAdded: prData.additions,\n linesRemoved: prData.deletions,\n linkedIssues,\n diff,\n issueContext,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to fetch PR info: ${message}`,\n suggestion: \"Ensure gh CLI is authenticated and has repo access\",\n };\n }\n}\n\nasync function buildReviewPrompt(\n ctx: PluginInput,\n _config: SdlcConfig,\n prNumber: number,\n prInfo: PrInfo,\n stages: number[]\n): Promise<string> {\n // Try to load custom prompt\n const customPromptPath = join(ctx.directory, \"prompts\", \"agents\", \"code-reviewer.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n basePrompt = getBuiltInReviewPrompt();\n }\n\n const stageInstructions = stages.map((s) => `Stage ${s}`).join(\", \");\n\n const contextSection = `\n## Review Context\n\n**PR Number:** #${prNumber}\n**Files Changed:** ${prInfo.filesChanged || \"unknown\"}\n**Lines:** +${prInfo.linesAdded || 0}/-${prInfo.linesRemoved || 0}\n**Linked Issues:** ${prInfo.linkedIssues?.map((n) => `#${n}`).join(\", \") || \"none\"}\n\n**Stages to Run:** ${stageInstructions}\n\n### Issue Context\n${prInfo.issueContext || \"No linked issues found.\"}\n\n### PR Diff\n\\`\\`\\`diff\n${prInfo.diff?.slice(0, 50000) || \"Unable to fetch diff\"}\n\\`\\`\\`\n`;\n\n return `${basePrompt}\\n\\n${contextSection}`;\n}\n\nfunction getBuiltInReviewPrompt(): string {\n return `# Code Reviewer Agent\n\nPerform a 3-stage PR review:\n\n## Stage 1: Specification Compliance\nMap acceptance criteria to implementation:\n- COMPLETE: AC fully implemented\n- MISSING: AC not implemented\n- INCOMPLETE: AC partially done\n- OVER-BUILT: Exceeds scope\n- DIVERGENT: Differs from intent\n\n## Stage 2: Code Quality\nFlag issues:\n- BUG_RISK: Could cause errors\n- MAINTAINABILITY: Future maintenance issues\n- STYLE: Convention violations\n- PERFORMANCE: Performance concerns\n\n## Stage 3: Domain Integrity\nCheck for:\n- Primitive obsession\n- Invalid states representable\n- Parse-don't-validate violations\n- Naming consistency\n\nOutput a structured review with findings for each stage.`;\n}\n\ninterface AgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnReviewAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n prNumber: number\n): Promise<AgentResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `PR Review: #${prNumber}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create review agent session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from review agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in review agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Review agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\ninterface ParsedReview {\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n}\n\nfunction parseReviewOutput(content: string): ParsedReview {\n const result: ParsedReview = {};\n\n // Parse Stage 1 findings\n const stage1Section = content.match(/##?\\s*Stage 1[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage [23]|$)/i);\n if (stage1Section) {\n const findings: SpecComplianceFinding[] = [];\n const statusMatches = stage1Section[1].matchAll(\n /\\|\\s*AC(\\d+)[^|]*\\|\\s*(COMPLETE|MISSING|INCOMPLETE|OVER-BUILT|DIVERGENT)[^|]*\\|([^|]*)\\|/gi\n );\n for (const match of statusMatches) {\n findings.push({\n issueNumber: 0,\n acNumber: Number.parseInt(match[1], 10),\n acText: \"\",\n status: match[2].toUpperCase() as SpecComplianceStatus,\n evidence: match[3]?.trim(),\n });\n }\n result.stage1 = {\n findings,\n summary: countSpecStatuses(findings),\n };\n }\n\n // Parse Stage 2 findings\n const stage2Section = content.match(/##?\\s*Stage 2[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage 3|$)/i);\n if (stage2Section) {\n const findings: CodeQualityFinding[] = [];\n const flagMatches = stage2Section[1].matchAll(\n /\\[(BUG_RISK|MAINTAINABILITY|STYLE|PERFORMANCE)\\][^\\n]*\\n\\*\\*File:\\*\\*\\s*`([^`]+)`(?::(\\d+))?/gi\n );\n for (const match of flagMatches) {\n findings.push({\n flag: match[1].toUpperCase() as QualityFlag,\n file: match[2],\n line: match[3] ? Number.parseInt(match[3], 10) : undefined,\n description: \"\",\n });\n }\n result.stage2 = {\n findings,\n summary: countQualityFlags(findings),\n };\n }\n\n // Parse Stage 3 violations\n const stage3Section = content.match(/##?\\s*Stage 3[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Summary|$)/i);\n if (stage3Section) {\n const violations: DomainViolation[] = [];\n const violationMatches = stage3Section[1].matchAll(\n /####\\s*(Primitive Obsession|Invalid State|Parse-Don't-Validate|Naming)[^\\n]*\\n\\*\\*Location:\\*\\*\\s*`([^`]+)`/gi\n );\n for (const match of violationMatches) {\n const typeMap: Record<string, DomainViolation[\"type\"]> = {\n \"primitive obsession\": \"primitive_obsession\",\n \"invalid state\": \"invalid_state\",\n \"parse-don't-validate\": \"parse_validate\",\n naming: \"naming\",\n };\n violations.push({\n type: typeMap[match[1].toLowerCase()] || \"naming\",\n location: match[2],\n description: \"\",\n impact: \"\",\n recommendation: \"\",\n });\n }\n\n // Try to extract score\n const scoreMatch = stage3Section[1].match(/Overall[^\\d]*(\\d+(?:\\.\\d+)?)\\s*\\/\\s*10/i);\n const score = scoreMatch ? Number.parseFloat(scoreMatch[1]) : 5;\n\n result.stage3 = { violations, score };\n }\n\n return result;\n}\n\nfunction countSpecStatuses(\n findings: SpecComplianceFinding[]\n): Record<SpecComplianceStatus, number> {\n const counts: Record<SpecComplianceStatus, number> = {\n COMPLETE: 0,\n MISSING: 0,\n INCOMPLETE: 0,\n \"OVER-BUILT\": 0,\n DIVERGENT: 0,\n };\n for (const finding of findings) {\n counts[finding.status]++;\n }\n return counts;\n}\n\nfunction countQualityFlags(findings: CodeQualityFinding[]): Record<QualityFlag, number> {\n const counts: Record<QualityFlag, number> = {\n BUG_RISK: 0,\n MAINTAINABILITY: 0,\n STYLE: 0,\n PERFORMANCE: 0,\n };\n for (const finding of findings) {\n counts[finding.flag]++;\n }\n return counts;\n}\n\n// Export for testing\nexport const _testExports = {\n executeReview,\n fetchPrInfo,\n parseReviewOutput,\n countSpecStatuses,\n countQualityFlags,\n};\n","import type { BmadAgentType, FindingCategory } from \"../../shared/types.js\";\n\nexport interface FindingCounts {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n}\n\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\nconst AGENT_EXPERTISE: Record<BmadAgentType, FindingCategory[]> = {\n architect: [\"security\", \"performance\"],\n dev: [\"logic\", \"performance\", \"bestPractices\"],\n tea: [\"logic\", \"bestPractices\"],\n pm: [\"logic\", \"bestPractices\"],\n analyst: [\"logic\"],\n \"ux-designer\": [\"bestPractices\"],\n \"tech-writer\": [\"bestPractices\"],\n sm: [\"bestPractices\"],\n};\n\nexport function selectAgentsForReview(findings: FindingCounts): AgentRecommendation[] {\n const recommendations: AgentRecommendation[] = [];\n\n if (findings.byCategory.security > 0) {\n addSecurityAgents(recommendations, findings);\n }\n\n if (findings.byCategory.logic > 0) {\n addLogicAgents(recommendations, findings);\n }\n\n if (findings.byCategory.performance > 0) {\n addPerformanceAgents(recommendations);\n }\n\n if (findings.byCategory.bestPractices > 0) {\n addBestPracticesAgents(recommendations, findings);\n }\n\n if (findings.high > 0) {\n recommendations.push({\n agent: \"pm\",\n reason: `${findings.high} high severity issue(s) need product impact assessment`,\n relevantFindings: [\"high-severity\"],\n priority: \"required\",\n });\n }\n\n ensureAtLeastOneRequired(recommendations);\n\n return recommendations;\n}\n\nfunction addSecurityAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n recommendations.push({\n agent: \"architect\",\n reason: `${findings.byCategory.security} security finding(s) require architecture review`,\n relevantFindings: [\"security\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n recommendations.push({\n agent: \"dev\",\n reason: \"Security findings need implementation perspective\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n recommendations.push({\n agent: \"tea\",\n reason: \"Security findings need test coverage review\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n}\n\nfunction addLogicAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.logic} logic gap(s) need implementation review`,\n relevantFindings: [\"logic\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"tea\")) {\n recommendations.push({\n agent: \"tea\",\n reason: \"Logic gaps need test scenario review\",\n relevantFindings: [\"logic\"],\n priority: \"recommended\",\n });\n }\n recommendations.push({\n agent: \"analyst\",\n reason: \"Logic gaps may indicate incomplete requirements\",\n relevantFindings: [\"logic\"],\n priority: \"optional\",\n });\n}\n\nfunction addPerformanceAgents(recommendations: AgentRecommendation[]): void {\n if (!recommendations.find((r) => r.agent === \"architect\")) {\n recommendations.push({\n agent: \"architect\",\n reason: \"Performance issues need architecture review\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: \"Performance issues need implementation perspective\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n}\n\nfunction addBestPracticesAgents(\n recommendations: AgentRecommendation[],\n findings: FindingCounts\n): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.bestPractices} best practice issue(s) need code review`,\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n }\n recommendations.push({\n agent: \"tech-writer\",\n reason: \"Best practice issues may need documentation updates\",\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n}\n\nfunction ensureAtLeastOneRequired(recommendations: AgentRecommendation[]): void {\n const requiredCount = recommendations.filter((r) => r.priority === \"required\").length;\n if (requiredCount === 0 && recommendations.length > 0) {\n recommendations[0].priority = \"required\";\n }\n}\n\nexport function getRecommendedAgentTypes(recommendations: AgentRecommendation[]): BmadAgentType[] {\n const seen = new Set<BmadAgentType>();\n const agents: BmadAgentType[] = [];\n\n for (const rec of recommendations) {\n if (!seen.has(rec.agent)) {\n seen.add(rec.agent);\n agents.push(rec.agent);\n }\n }\n\n return agents;\n}\n\nexport function filterByPriority(\n recommendations: AgentRecommendation[],\n minPriority: \"required\" | \"recommended\" | \"optional\"\n): AgentRecommendation[] {\n const priorityOrder = { required: 0, recommended: 1, optional: 2 };\n const minLevel = priorityOrder[minPriority];\n\n return recommendations.filter((r) => priorityOrder[r.priority] <= minLevel);\n}\n\nexport { AGENT_EXPERTISE };\n","import { join } from \"node:path\";\n\nconst ISSUE_PREFIX_PATTERN = /^(issue[-\\s]?|#)/i;\nconst ISSUE_TOKEN_SPLIT = /[\\s,]+/;\n\nexport function parseIssueIdentifiers(input: string): number[] {\n if (!input) return [];\n\n const tokens = input.split(ISSUE_TOKEN_SPLIT).map((token) => token.trim());\n const results = new Set<number>();\n\n for (const token of tokens) {\n if (!token) continue;\n\n const cleaned = token.replace(ISSUE_PREFIX_PATTERN, \"\").trim();\n if (!cleaned) continue;\n\n const value = Number.parseInt(cleaned, 10);\n if (Number.isFinite(value) && value > 0) {\n results.add(value);\n }\n }\n\n return Array.from(results);\n}\n\nexport function formatIssueList(issueNumbers: number[]): string {\n return issueNumbers.map((issueNumber) => `#${issueNumber}`).join(\", \");\n}\n\nexport function getReviewsDirectory(projectRoot: string): string {\n return join(projectRoot, \".opencode\", \"sdlc\", \"reviews\");\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n FindingCategory,\n Phase1FullData,\n Phase1Summary,\n ReviewScope,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport {\n type AgentRecommendation,\n type FindingCounts,\n selectAgentsForReview,\n} from \"../utils/agent-selector.js\";\nimport { fetchIssue } from \"../utils/github-issues.js\";\nimport {\n formatIssueList,\n getReviewsDirectory,\n parseIssueIdentifiers,\n} from \"../utils/issue-review-utils.js\";\nimport {\n type FindingDetail,\n type ParsedOracleResponse,\n countFindings,\n parseOracleResponse,\n} from \"../utils/oracle-parser.js\";\n\nexport function createStoryReviewAnalyzeTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Analyze GitHub issues for security, logic, best practice, and performance gaps.\n\nThis tool performs Phase 1 of the party review workflow:\n1. Loads issue bodies and optional architecture context\n2. Spawns Oracle agent to analyze for issues\n3. Parses findings by severity and category\n4. Recommends expert agents for discussion\n5. Generates and saves a review document\n\nReturns a complete Phase 1 result that can be passed to Phase 2 (sdlc_story_review_consult) or Phase 3 (sdlc_party_discussion).\n\nUse this BEFORE development to catch issues early.`,\n\n args: {\n identifier: tool.schema\n .string()\n .describe(\"Comma-separated issue numbers (e.g., '12, 34') or a single issue number\"),\n thorough: tool.schema\n .boolean()\n .optional()\n .describe(\"Force advanced model for deeper analysis (default: auto-detect)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase1Analysis(ctx, config, args.identifier, args.thorough);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase1Analysis(\n ctx: PluginInput,\n config: SdlcConfig,\n identifier: string,\n forceAdvancedModel?: boolean\n): Promise<Phase1Summary> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const issueNumbers = parseIssueIdentifiers(identifier);\n if (issueNumbers.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issue numbers provided\",\n suggestion: \"Provide at least one GitHub issue number (e.g., '12' or '12, 34')\",\n };\n }\n\n const reviewsDir = getReviewsDirectory(ctx.directory);\n await ensureDirectory(reviewsDir);\n\n const issuesContent = await loadIssues(ctx, config, issueNumbers);\n if (issuesContent.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issues found\",\n suggestion: \"Check the issue numbers and repository settings\",\n };\n }\n\n const scope: ReviewScope = issuesContent.length > 1 ? \"multi-issue\" : \"issue\";\n const issueLabel = formatIssueList(issueNumbers);\n\n const oraclePrompt = buildOraclePrompt(scope, issueLabel, issuesContent, \"\");\n const oracleResponse = await spawnOracleAndWait(ctx, config, oraclePrompt, forceAdvancedModel);\n\n if (!oracleResponse.success) {\n return {\n success: false,\n scope,\n identifier: issueLabel,\n error: oracleResponse.error || \"Oracle analysis failed\",\n suggestion: \"Check that the Oracle agent is configured correctly.\",\n };\n }\n\n const parsed = parseOracleResponse(oracleResponse.content || \"\");\n const findings = countFindings(parsed);\n const recommendedAgents = selectAgentsForReview(findings);\n const summary = buildSummary(findings, recommendedAgents);\n\n const reviewFolderPath = await saveReviewFolder(\n reviewsDir,\n scope,\n issueLabel,\n issuesContent,\n parsed,\n oracleResponse.content || \"\",\n findings,\n recommendedAgents,\n summary\n );\n\n return {\n success: true,\n scope,\n identifier: issueLabel,\n findings,\n recommendedAgents,\n reviewFolderPath,\n summary,\n };\n}\n\nasync function loadIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumbers: number[]\n): Promise<Array<{ id: string; content: string | null }>> {\n const results: Array<{ id: string; content: string | null }> = [];\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n results.push({\n id: `#${issue.number}`,\n content: formatIssueContent(issue.title, issue.body),\n });\n }\n\n return results;\n}\n\nfunction formatIssueContent(title: string, body: string | null): string {\n const content = body?.trim() ? body.trim() : \"(empty)\";\n return `# ${title}\\n\\n${content}`;\n}\n\nasync function ensureDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nfunction buildOraclePrompt(\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n architecture: string | null\n): string {\n const issuesText = stories\n .map((s) => `## Issue ${s.id}\\n\\n${s.content || \"(empty)\"}`)\n .join(\"\\n\\n---\\n\\n\");\n\n const scopeDescription =\n scope === \"multi-issue\"\n ? `Issues ${identifier} - Review ALL issues for issues AND cross-issue patterns`\n : `Issue ${identifier} - Deep dive focused review`;\n\n return `You are a security, logic, and performance expert conducting a \"party review\" of GitHub issues BEFORE development begins.\n\n**Your Role**: Find issues while they're cheap to fix (in markdown, not code).\n\n**Focus Areas**:\n1. 🔒 **Security Gaps**: Missing auth/authorization, input validation, data exposure risks\n2. 🧠 **Logic Gaps**: Edge cases not covered, error scenarios missing, validation rules incomplete\n3. ✨ **Best Practice Flaws**: Anti-patterns, testing strategy gaps, accessibility concerns\n4. ⚡ **Performance Issues**: N+1 queries, missing caching, large data handling\n\n**Scope**: ${scopeDescription}\n\n**Architecture Context**:\n${architecture || \"(No architecture documented)\"}\n\n**Issues to Review**:\n${issuesText}\n\n**Output Format** (JSON):\n{\n \"summary\": {\n \"totalIssues\": number,\n \"highSeverity\": number,\n \"mediumSeverity\": number,\n \"lowSeverity\": number,\n \"recommendation\": \"string\"\n },\n ${\n scope === \"multi-issue\"\n ? `\"issueFindings\": [\n {\n \"issueId\": \"string\",\n \"title\": \"string\",\n \"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }\n }\n ],\n \"crossIssueIssues\": [\n {\n \"id\": \"unique-id\",\n \"category\": \"security\" | \"logic\" | \"bestPractices\" | \"performance\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Pattern or issue across multiple issues\",\n \"description\": \"Details\",\n \"affectedIssues\": [\"#12\", \"#34\"],\n \"suggestion\": \"How to address\"\n }\n ]`\n : `\"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix (be specific)\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }`\n }\n}\n\n**Instructions**:\n- Be thorough but practical\n- Prioritize high-impact issues\n- Provide actionable suggestions\n- Flag missing requirements as logic gaps`;\n}\n\ninterface OracleResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnOracleAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n _forceAdvancedModel?: boolean\n): Promise<OracleResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review - Oracle Analysis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create Oracle session\" };\n }\n\n const sessionId = createResult.data.id;\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.oracle),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from Oracle\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in Oracle session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Oracle spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"openai\", modelID: modelID || modelString };\n}\n\nasync function saveReviewFolder(\n reviewsDir: string,\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n parsed: ParsedOracleResponse,\n oracleAnalysis: string,\n findings: FindingCounts,\n recommendedAgents: AgentRecommendation[],\n summaryText: string\n): Promise<string> {\n const date = new Date().toISOString().split(\"T\")[0];\n const folderName = `party-review-${scope}-${identifier.replace(/[^\\d#]+/g, \"-\")}-${date}`;\n const scopeLabel = scope === \"multi-issue\" ? \"Issues\" : \"Issue\";\n const folderPath = join(reviewsDir, folderName);\n\n await ensureDirectory(folderPath);\n\n const storyList = stories.map((s) => s.id).join(\", \");\n const { summary } = parsed;\n\n const markdown = `# Party Review: ${scopeLabel} ${identifier}\n\n**Date**: ${date}\n**Reviewer**: Oracle (Party Mode)\n**Issues Reviewed**: ${storyList}\n\n---\n\n## Executive Summary\n\n- **Total Issues**: ${summary.totalIssues}\n- **High Severity**: ${summary.highSeverity} issues (MUST address)\n- **Medium Severity**: ${summary.mediumSeverity} issues (SHOULD address)\n- **Low Severity**: ${summary.lowSeverity} issues (NICE to address)\n\n**Recommendation**: ${summary.recommendation}\n\n---\n\n## Findings\n\n${formatFindings(parsed)}\n\n---\n\n## Appendix: Oracle's Full Analysis\n\n<details>\n<summary>Click to expand detailed reasoning</summary>\n\n${oracleAnalysis}\n\n</details>\n`;\n\n const fullData: Phase1FullData = {\n success: true,\n scope,\n identifier,\n findings,\n recommendedAgents,\n reviewFolderPath: folderPath,\n summary: summaryText,\n storiesContent: stories,\n oracleAnalysis,\n };\n\n await writeFile(join(folderPath, \"review.md\"), markdown, \"utf-8\");\n await writeFile(join(folderPath, \"analysis.json\"), JSON.stringify(fullData, null, 2), \"utf-8\");\n\n return folderPath;\n}\n\nfunction formatFindings(parsed: ParsedOracleResponse): string {\n let output = \"\";\n\n const categoryIcons: Record<string, string> = {\n security: \"🔒\",\n logic: \"🧠\",\n bestPractices: \"✨\",\n performance: \"⚡\",\n };\n\n if (parsed.findings) {\n for (const [category, findings] of Object.entries(parsed.findings)) {\n if (findings && findings.length > 0) {\n output += `### ${categoryIcons[category] || \"\"} ${formatCategoryName(category)} (${findings.length} issues)\\n\\n`;\n for (const finding of findings) {\n output += `#### [${finding.severity.toUpperCase()}] ${finding.title}\\n`;\n output += `**Finding**: ${finding.description}\\n`;\n output += `**Impact**: ${finding.impact}\\n`;\n output += `**Suggestion**: ${finding.suggestion}\\n`;\n output += \"**Decision**: [ ] Accept [ ] Defer [ ] Reject\\n\\n\";\n }\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n output += `### Issue ${issue.issueId}: ${issue.title}\\n\\n`;\n for (const [category, findings] of Object.entries(issue.findings)) {\n const typedFindings = findings as FindingDetail[];\n if (typedFindings.length === 0) continue;\n\n output += `#### ${formatCategoryName(category as FindingCategory)} (${typedFindings.length})\\n\\n`;\n\n for (const finding of typedFindings) {\n output += `- [${finding.severity}] ${finding.title}\\n`;\n output += ` - ${finding.description}\\n`;\n output += ` - Impact: ${finding.impact}\\n`;\n output += ` - Suggestion: ${finding.suggestion}\\n\\n`;\n }\n }\n }\n }\n\n if (parsed.crossIssueIssues && parsed.crossIssueIssues.length > 0) {\n output += \"### Cross-Issue Issues\\n\\n\";\n for (const issue of parsed.crossIssueIssues) {\n output += `- [${issue.severity}] ${issue.title}\\n`;\n output += ` - ${issue.description}\\n`;\n output += ` - Affected Issues: ${issue.affectedIssues.join(\", \")}\\n`;\n output += ` - Suggestion: ${issue.suggestion}\\n\\n`;\n }\n }\n\n return output || \"No findings detected.\";\n}\n\nfunction formatCategoryName(category: string): string {\n const names: Record<string, string> = {\n security: \"Security Issues\",\n logic: \"Logic Issues\",\n bestPractices: \"Best Practices\",\n performance: \"Performance Issues\",\n };\n return names[category] || category;\n}\n\nfunction buildSummary(findings: FindingCounts, agents: AgentRecommendation[]): string {\n const agentList = agents\n .filter((a) => a.priority !== \"optional\")\n .map((a) => a.agent)\n .join(\", \");\n\n return `Found ${findings.total} issues (${findings.high} high, ${findings.medium} medium, ${findings.low} low). Recommended agents: ${agentList || \"none\"}.`;\n}\n","import type { BmadAgentType } from \"../../shared/types.js\";\n\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: Array<{\n pattern: string;\n affectedStories: string[];\n recommendation: string;\n }>;\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface SynthesizedResult {\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n}\n\nexport function synthesizeAgentResponses(analyses: AgentAnalysis[]): SynthesizedResult {\n const consensusPoints = findConsensusPoints(analyses);\n const debatePoints = findDebatePoints(analyses);\n const aggregatedPriorities = aggregatePriorities(analyses);\n\n return {\n agentAnalyses: analyses,\n consensusPoints,\n debatePoints,\n aggregatedPriorities,\n };\n}\n\nfunction calculateConsensusThreshold(totalAgents: number): number {\n const minimumAgents = 2;\n const proportionalThreshold = Math.ceil(totalAgents * 0.5);\n return Math.max(minimumAgents, proportionalThreshold);\n}\n\nfunction findConsensusPoints(analyses: AgentAnalysis[]): ConsensusPoint[] {\n const concernMap = new Map<string, { agents: BmadAgentType[]; positions: string[] }>();\n\n for (const analysis of analyses) {\n for (const concern of analysis.findings.concerns) {\n const key = normalizeForComparison(concern);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(concern);\n concernMap.set(key, existing);\n }\n\n for (const agreement of analysis.findings.agreements) {\n const key = normalizeForComparison(agreement);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(agreement);\n concernMap.set(key, existing);\n }\n }\n\n const consensusThreshold = calculateConsensusThreshold(analyses.length);\n const consensusPoints: ConsensusPoint[] = [];\n\n for (const [_, data] of concernMap) {\n if (data.agents.length >= consensusThreshold) {\n consensusPoints.push({\n topic: data.positions[0],\n agents: data.agents,\n position: data.positions[0],\n });\n }\n }\n\n return consensusPoints;\n}\n\nfunction findDebatePoints(analyses: AgentAnalysis[]): DebatePoint[] {\n const debatePoints: DebatePoint[] = [];\n const processedPairs = new Set<string>();\n\n for (let i = 0; i < analyses.length; i++) {\n for (let j = i + 1; j < analyses.length; j++) {\n const agent1 = analyses[i];\n const agent2 = analyses[j];\n const pairKey = `${agent1.agent}-${agent2.agent}`;\n\n if (processedPairs.has(pairKey)) continue;\n processedPairs.add(pairKey);\n\n const conflictingPriorities = findConflictingPriorities(agent1, agent2);\n for (const conflict of conflictingPriorities) {\n debatePoints.push({\n topic: `Priority disagreement on ${conflict.findingId}`,\n positions: [\n { agent: agent1.agent, position: `${conflict.priority1}: ${conflict.rationale1}` },\n { agent: agent2.agent, position: `${conflict.priority2}: ${conflict.rationale2}` },\n ],\n });\n }\n }\n }\n\n return debatePoints;\n}\n\ninterface PriorityConflict {\n findingId: string;\n priority1: string;\n rationale1: string;\n priority2: string;\n rationale2: string;\n}\n\nfunction findConflictingPriorities(\n agent1: AgentAnalysis,\n agent2: AgentAnalysis\n): PriorityConflict[] {\n const conflicts: PriorityConflict[] = [];\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n\n for (const issue1 of agent1.prioritizedIssues) {\n const matchingIssue = agent2.prioritizedIssues.find((i) =>\n i.findingId.toLowerCase().includes(issue1.findingId.toLowerCase())\n );\n\n if (matchingIssue) {\n const diff = Math.abs(\n priorityOrder[issue1.agentPriority] - priorityOrder[matchingIssue.agentPriority]\n );\n if (diff >= 2) {\n conflicts.push({\n findingId: issue1.findingId,\n priority1: issue1.agentPriority,\n rationale1: issue1.rationale,\n priority2: matchingIssue.agentPriority,\n rationale2: matchingIssue.rationale,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nfunction aggregatePriorities(analyses: AgentAnalysis[]): AggregatedPriority[] {\n const priorityMap = new Map<\n string,\n { votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>; count: number }\n >();\n\n for (const analysis of analyses) {\n for (const issue of analysis.prioritizedIssues) {\n const existing = priorityMap.get(issue.findingId) || { votes: {}, count: 0 };\n existing.votes[analysis.agent] = issue.agentPriority;\n existing.count++;\n priorityMap.set(issue.findingId, existing);\n }\n }\n\n const aggregated: AggregatedPriority[] = [];\n for (const [findingId, data] of priorityMap) {\n const votes = Object.values(data.votes);\n const consensusLevel = calculateConsensusLevel(votes);\n const averagePriority = calculateAveragePriority(votes);\n\n aggregated.push({\n findingId,\n votes: data.votes,\n consensusLevel,\n averagePriority,\n });\n }\n\n return aggregated;\n}\n\nfunction calculateConsensusLevel(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"strong\" | \"moderate\" | \"disputed\" {\n if (votes.length <= 1) return \"strong\";\n\n const uniqueVotes = new Set(votes);\n if (uniqueVotes.size === 1) return \"strong\";\n if (uniqueVotes.size === 2) return \"moderate\";\n return \"disputed\";\n}\n\nfunction calculateAveragePriority(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"critical\" | \"important\" | \"minor\" {\n if (votes.length === 0) return \"minor\";\n\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n const sum = votes.reduce((acc, v) => acc + priorityOrder[v], 0);\n const avg = sum / votes.length;\n\n if (avg < 0.5) return \"critical\";\n if (avg < 1.5) return \"important\";\n return \"minor\";\n}\n\nfunction normalizeForComparison(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\")\n .split(/\\s+/)\n .slice(0, 5)\n .join(\" \");\n}\n\nexport function parseAgentResponse(responseText: string | null | undefined): AgentAnalysis | null {\n if (!responseText || typeof responseText !== \"string\") {\n return null;\n }\n\n try {\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as AgentAnalysis;\n\n if (!parsed.agent || !parsed.findings) return null;\n\n return {\n agent: parsed.agent,\n perspective: parsed.perspective || \"\",\n findings: {\n agreements: parsed.findings.agreements || [],\n concerns: parsed.findings.concerns || [],\n suggestions: parsed.findings.suggestions || [],\n },\n crossStoryPatterns: parsed.crossStoryPatterns || [],\n prioritizedIssues: parsed.prioritizedIssues || [],\n summary: parsed.summary || \"\",\n };\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentAnalysis,\n BmadAgentType,\n Phase1FullData,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { getRecommendedAgentTypes } from \"../utils/agent-selector.js\";\nimport { getPersona, loadPersonas } from \"../utils/persona-loader.js\";\nimport {\n type SynthesizedResult,\n parseAgentResponse,\n synthesizeAgentResponses,\n} from \"../utils/response-synthesizer.js\";\n\nexport interface Phase2ConsultResult {\n success: boolean;\n identifier: string;\n reviewFolderPath?: string;\n error?: string;\n suggestion?: string;\n\n agentAnalyses?: AgentAnalysis[];\n consensusPoints?: SynthesizedResult[\"consensusPoints\"];\n debatePoints?: SynthesizedResult[\"debatePoints\"];\n aggregatedPriorities?: SynthesizedResult[\"aggregatedPriorities\"];\n summary?: string;\n}\n\nexport function createStoryReviewConsultTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Consult BMAD expert agents for their perspectives on review findings.\n\nThis tool performs Phase 2 of the party review workflow:\n1. Loads the full analysis from the review folder (analysis.json)\n2. Spawns parallel sessions for each recommended BMAD agent\n3. Each agent reads the analysis file and provides their perspective\n4. Waits for all agents to complete (blocking)\n5. Synthesizes responses to find consensus and debates\n\nUse this after Phase 1 (sdlc_story_review_analyze) and before Phase 3 (sdlc_party_discussion). This phase is still issue-focused; it reads the issue review folder and consults the same BMAD agents.`,\n\n args: {\n reviewFolderPath: tool.schema\n .string()\n .describe(\n \"Path to the review folder from sdlc_story_review_analyze (contains analysis.json)\"\n ),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Override agent list (default: use recommended from phase1)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase2Consultation(\n ctx,\n config,\n args.reviewFolderPath,\n args.agents\n );\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase2Consultation(\n ctx: PluginInput,\n config: SdlcConfig,\n reviewFolderPath: string,\n overrideAgents?: string[]\n): Promise<Phase2ConsultResult> {\n const analysisPath = join(reviewFolderPath, \"analysis.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n identifier: \"\",\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return {\n success: false,\n identifier: \"\",\n error: `Failed to load analysis.json: ${message}`,\n suggestion: \"Ensure the review folder contains a valid analysis.json file\",\n };\n }\n\n if (!phase1.success || !phase1.oracleAnalysis) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"Phase 1 was not successful or missing oracle analysis\",\n suggestion: \"Run sdlc_story_review_analyze first\",\n };\n }\n\n const agents = overrideAgents\n ? (overrideAgents as BmadAgentType[])\n : getRecommendedAgentTypes(phase1.recommendedAgents || []);\n\n if (agents.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"No agents to consult\",\n suggestion: \"Specify agents or ensure Phase 1 has recommendations\",\n };\n }\n\n const personas = await loadPersonas();\n\n const agentPromises = agents.map((agentType) =>\n spawnAgentAndWait(ctx, config, agentType, phase1, personas)\n );\n\n const agentResults = await Promise.all(agentPromises);\n\n const successfulAnalyses = agentResults.filter((r): r is AgentAnalysis => r !== null);\n\n if (successfulAnalyses.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"All agent consultations failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n const synthesized = synthesizeAgentResponses(successfulAnalyses);\n\n const normalizedAnalyses = synthesized.agentAnalyses.map((analysis) => {\n const persona = getPersona(personas, analysis.agent);\n return enrichAgentAnalysis(analysis, analysis.agent, persona.name, phase1);\n });\n\n const summary = buildConsultationSummary(synthesized, agents.length);\n\n const result: Phase2ConsultResult = {\n success: true,\n identifier: phase1.identifier,\n reviewFolderPath,\n agentAnalyses: normalizedAnalyses,\n consensusPoints: synthesized.consensusPoints,\n debatePoints: synthesized.debatePoints,\n aggregatedPriorities: synthesized.aggregatedPriorities,\n summary,\n };\n\n const phase2Path = join(reviewFolderPath, \"phase2.json\");\n await writeFile(phase2Path, JSON.stringify(result, null, 2), \"utf-8\");\n\n return result;\n}\n\nasync function spawnAgentAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n agentType: BmadAgentType,\n phase1: Phase1FullData,\n personas: Map<BmadAgentType, import(\"../../shared/types.js\").BmadAgentFullPersona>\n): Promise<AgentAnalysis | null> {\n try {\n const persona = getPersona(personas, agentType);\n const prompt = buildAgentPrompt(persona, phase1);\n\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review - ${persona.name} Analysis`,\n },\n });\n\n if (!createResult.data?.id) {\n console.warn(`[Sdlc] Failed to create session for ${agentType}`);\n return null;\n }\n\n const sessionId = createResult.data.id;\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n console.warn(`[Sdlc] No response from ${agentType}`);\n return null;\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n const parsed = parseAgentResponse(content);\n if (!parsed) {\n return createFallbackAnalysis(agentType, persona.name, content);\n }\n\n return enrichAgentAnalysis(parsed, agentType, persona.name, phase1);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(`[Sdlc] Agent ${agentType} consultation failed: ${message}`);\n return null;\n }\n}\n\nfunction buildAgentPrompt(\n persona: import(\"../../shared/types.js\").BmadAgentFullPersona,\n phase1: Phase1FullData\n): string {\n const storiesContext = phase1.storiesContent\n ?.map((s: { id: string; content: string | null }) => {\n const preview = s.content?.substring(0, 2000) || \"(empty)\";\n const truncated = s.content && s.content.length > 2000 ? \"...[truncated]\" : \"\";\n return `Issue ${s.id}:\\n${preview}${truncated}`;\n })\n .join(\"\\n\\n\");\n\n return `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Task**: Analyze the following Oracle review findings from your ${persona.type} perspective.\n\n**Issues Being Reviewed**:\n${storiesContext || \"(No issue content available)\"}\n\n**Oracle's Findings**:\n${phase1.oracleAnalysis || \"(No analysis available)\"}\n\n**Your Analysis Instructions**:\n1. Review each finding from your ${persona.perspective} perspective\n2. Note findings you agree with and why\n3. Raise any concerns specific to your expertise\n4. Suggest additional considerations\n5. Prioritize issues based on ${persona.expertise[0] || \"your expertise\"} impact\n\n **Return JSON** (MUST be valid JSON):\n {\n \"agent\": \"${persona.type}\",\n \"perspective\": \"${persona.perspective}\",\n \"findings\": {\n \"agreements\": [\"I agree with X because...\"],\n \"concerns\": [\"From my perspective, Y is concerning because...\"],\n \"suggestions\": [\"Consider also Z...\"]\n },\n \"crossStoryPatterns\": [\n { \"pattern\": \"...\", \"affectedStories\": [\"#12\"], \"recommendation\": \"...\" }\n ],\n \"prioritizedIssues\": [\n { \"findingId\": \"...\", \"agentPriority\": \"critical|important|minor\", \"rationale\": \"...\" }\n ],\n \"summary\": \"Brief 2-3 sentence summary of my analysis\"\n }`;\n}\n\nfunction enrichAgentAnalysis(\n analysis: AgentAnalysis,\n agentType: BmadAgentType,\n agentName: string,\n phase1: Phase1FullData\n): AgentAnalysis {\n const issuesAnalyzed = (phase1.storiesContent || []).map((story) => story.id);\n const analyzedAt = new Date().toISOString();\n\n return {\n ...analysis,\n agent: agentType,\n agentName: analysis.agentName || agentName,\n analyzedAt: analysis.analyzedAt || analyzedAt,\n storiesAnalyzed: analysis.storiesAnalyzed || issuesAnalyzed,\n };\n}\n\nfunction createFallbackAnalysis(\n agentType: BmadAgentType,\n agentName: string,\n rawContent: string\n): AgentAnalysis {\n return {\n agent: agentType,\n agentName,\n analyzedAt: new Date().toISOString(),\n storiesAnalyzed: [],\n perspective: `${agentName}'s perspective`,\n findings: {\n agreements: [],\n concerns: [rawContent.substring(0, 200)],\n suggestions: [],\n },\n crossStoryPatterns: [],\n prioritizedIssues: [],\n summary: `${agentName} provided analysis but response was not in expected JSON format.`,\n };\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction buildConsultationSummary(synthesized: SynthesizedResult, totalAgents: number): string {\n const successCount = synthesized.agentAnalyses.length;\n const consensusCount = synthesized.consensusPoints.length;\n const debateCount = synthesized.debatePoints.length;\n\n return `Consulted ${successCount}/${totalAgents} agents. Found ${consensusCount} consensus points and ${debateCount} debate points.`;\n}\n","/**\n * sdlc_domain Tool\n *\n * DOMAIN phase of TDD: Domain modeling review\n *\n * Reviews code for domain violations and creates domain types.\n * Has VETO power to block the workflow if domain integrity is compromised.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Context for the DOMAIN phase\n */\nexport type DomainContext = \"AFTER_RED\" | \"AFTER_GREEN\" | \"PR_REVIEW\";\n\n/**\n * Arguments for sdlc_domain tool\n */\nexport interface DomainArgs {\n context: DomainContext;\n testOrImplementationPath: string;\n}\n\n/**\n * Domain violation detected by the review\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"structural_type\" | \"parse_validate\";\n location: string;\n description: string;\n suggestion: string;\n}\n\n/**\n * Result from sdlc_domain tool\n */\nexport interface DomainResult {\n success: boolean;\n approved: boolean;\n vetoed: boolean;\n violations?: DomainViolation[];\n typesCreated?: string[];\n vetoReason?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_domain tool\n */\nexport function createDomainTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `DOMAIN phase of TDD: Review for domain integrity and create types.\n\nThis tool spawns a domain expert agent that:\n- Reviews tests/implementations for domain violations\n- Creates domain types BEFORE implementation\n- Has VETO power to block workflow if domain integrity is compromised\n- Can edit type definition files only\n\nDomain violations detected:\n- Primitive obsession (String instead of Email)\n- Structural types (NonEmptyString instead of UserName) \n- Invalid states representable\n- Parse-don't-validate violations\n\nContext types:\n- AFTER_RED: Review test before implementation\n- AFTER_GREEN: Review implementation for domain compliance\n- PR_REVIEW: Full review for pull request`,\n\n args: {\n context: tool.schema\n .enum([\"AFTER_RED\", \"AFTER_GREEN\", \"PR_REVIEW\"])\n .describe(\"When the review is happening in the TDD cycle\"),\n testOrImplementationPath: tool.schema\n .string()\n .describe(\"Path to the test file (AFTER_RED) or implementation file (AFTER_GREEN)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDomainPhase(ctx, config, tracker, args as DomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeDomainPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: DomainArgs\n): Promise<DomainResult> {\n // Validate inputs\n if (!args.testOrImplementationPath) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: \"testOrImplementationPath is required\",\n suggestion: \"Provide the path to the file to review\",\n };\n }\n\n // Check cycle state based on context\n const expectedContext = args.context === \"AFTER_RED\" ? \"red\" : \"green\";\n\n if (args.context !== \"PR_REVIEW\") {\n const canStart = tracker.canTransitionTo(\"domain\");\n if (!canStart.valid) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: canStart.reason,\n suggestion: `Complete the ${expectedContext.toUpperCase()} phase before DOMAIN review`,\n };\n }\n\n // Start DOMAIN phase in tracker\n const startResult = tracker.startDomain(expectedContext as \"red\" | \"green\");\n if (!startResult.success) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: startResult.error,\n };\n }\n }\n\n // Load DOMAIN prompt\n const domainPrompt = await loadDomainPrompt(ctx.directory, args);\n\n // Spawn DOMAIN agent\n const agentResult = await spawnDomainAgent(ctx, config, domainPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: agentResult.error || \"DOMAIN agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Update tracker based on result\n if (args.context !== \"PR_REVIEW\") {\n if (agentResult.vetoed && agentResult.vetoReason) {\n tracker.vetoDomain(agentResult.vetoReason);\n } else {\n tracker.approveDomain(agentResult.typesCreated || []);\n }\n }\n\n return {\n success: true,\n approved: agentResult.approved ?? false,\n vetoed: agentResult.vetoed ?? false,\n violations: agentResult.violations,\n typesCreated: agentResult.typesCreated,\n vetoReason: agentResult.vetoReason,\n };\n}\n\nasync function loadDomainPrompt(projectDir: string, args: DomainArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"domain.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInDomainPrompt();\n }\n\n // Add context-specific instructions\n let contextInstructions = \"\";\n\n switch (args.context) {\n case \"AFTER_RED\":\n contextInstructions = `\n## Context: AFTER_RED\n\nReview the test file BEFORE implementation begins.\n\n**File to Review:**\n${args.testOrImplementationPath}\n\nCheck:\n1. Are domain concepts properly represented in test assertions?\n2. Does the test use semantic types or raw primitives?\n3. Should new domain types be created before implementation?\n\nIf domain types are needed, create them now.\nIf the test uses primitives where domain types should exist, VETO.\n`;\n break;\n\n case \"AFTER_GREEN\":\n contextInstructions = `\n## Context: AFTER_GREEN\n\nReview the implementation AFTER the test passes.\n\n**File to Review:**\n${args.testOrImplementationPath}\n\nCheck:\n1. Does the implementation use domain types correctly?\n2. Are there primitive obsession patterns?\n3. Can invalid states be represented?\n4. Are parse-don't-validate patterns followed?\n\nIf violations are found, VETO and list required changes.\n`;\n break;\n\n case \"PR_REVIEW\":\n contextInstructions = `\n## Context: PR_REVIEW\n\nFull domain review for pull request.\n\n**Files to Review:**\n${args.testOrImplementationPath}\n\nPerform a comprehensive review:\n1. Check all domain types for proper semantics\n2. Ensure ubiquitous language consistency\n3. Verify no domain drift has occurred\n4. Check for primitive obsession across the codebase\n\nThis is a thorough review - be strict about domain integrity.\n`;\n break;\n }\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInDomainPrompt(): string {\n return `# DOMAIN Phase Agent\n\nYou are the domain modeling expert in TDD. Guard domain integrity.\n\n## Your Powers\n- Can EDIT type definition files (types.ts, *.types.ts, domain/*.ts)\n- Can VETO workflow if domain integrity is compromised\n- Can CREATE new domain types before implementation\n\n## Violations to Detect\n\n1. **Primitive Obsession**\n - Using string for Email, UserId, etc.\n - Solution: Create branded types\n\n2. **Invalid States Representable**\n - User.verified=true with User.verifiedAt=null\n - Solution: Use discriminated unions\n\n3. **Structural Types**\n - NonEmptyString instead of UserName\n - Solution: Use semantic types with meaning\n\n4. **Parse-Don't-Validate**\n - Validating then using raw primitives\n - Solution: Parse into domain types\n\n## Output Format\n\nAPPROVED:\n- List any types created\n- Note any recommendations\n\nVETOED:\n- List each violation with location\n- Explain why it's a domain violation\n- Specify required changes\n- BLOCK workflow until fixed`;\n}\n\ninterface AgentResult {\n success: boolean;\n approved?: boolean;\n vetoed?: boolean;\n violations?: DomainViolation[];\n typesCreated?: string[];\n vetoReason?: string;\n error?: string;\n}\n\nasync function spawnDomainAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for DOMAIN agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD DOMAIN Phase - Domain Review\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create DOMAIN agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as DOMAIN subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"domain\");\n\n try {\n // Send prompt to agent - use Oracle model for domain expertise\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from DOMAIN agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in DOMAIN agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to determine approval/veto\n const parsed = parseDomainAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `DOMAIN agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseDomainAgentResponse(content: string): Partial<AgentResult> {\n const isVetoed = content.match(/\\bVETO(?:ED)?\\b/i) !== null;\n const isApproved = content.match(/\\bAPPROVED?\\b/i) !== null && !isVetoed;\n\n const violations: DomainViolation[] = [];\n\n // Try to extract violations\n const violationMatches = content.matchAll(\n /(?:VIOLATION|Issue):\\s*(.+?)(?:\\n(?:Location|File):\\s*(.+?))?(?:\\n(?:Description|Reason):\\s*(.+?))?(?:\\n(?:Suggestion|Fix):\\s*(.+?))?(?=\\n\\n|\\n[A-Z]|$)/gis\n );\n\n for (const match of violationMatches) {\n const type = inferViolationType(match[1] || \"\");\n violations.push({\n type,\n location: match[2]?.trim() || \"unknown\",\n description: match[3]?.trim() || match[1]?.trim() || \"Domain violation detected\",\n suggestion: match[4]?.trim() || \"Fix the domain violation\",\n });\n }\n\n // Try to extract types created\n const typesMatch = content.match(/(?:Types? created|Created types?)[^\\n]*:\\s*([^\\n]+)/i);\n const typesCreated = typesMatch\n ? typesMatch[1].split(/[,\\s]+/).filter((t) => t.trim())\n : undefined;\n\n // Extract veto reason\n let vetoReason: string | undefined;\n if (isVetoed) {\n const reasonMatch = content.match(/(?:VETO(?:ED)?[^\\n]*\\n)(.+?)(?=\\n\\n|$)/is);\n vetoReason = reasonMatch?.[1]?.trim() || \"Domain integrity violation detected\";\n }\n\n return {\n approved: isApproved,\n vetoed: isVetoed,\n violations: violations.length > 0 ? violations : undefined,\n typesCreated,\n vetoReason,\n };\n}\n\nfunction inferViolationType(\n text: string\n): \"primitive_obsession\" | \"invalid_state\" | \"structural_type\" | \"parse_validate\" {\n const lower = text.toLowerCase();\n\n if (lower.includes(\"primitive\")) return \"primitive_obsession\";\n if (lower.includes(\"invalid state\") || lower.includes(\"representable\")) return \"invalid_state\";\n if (lower.includes(\"structural\")) return \"structural_type\";\n if (lower.includes(\"parse\") || lower.includes(\"validate\")) return \"parse_validate\";\n\n return \"primitive_obsession\"; // Default\n}\n\n// Export for testing\nexport const _testExports = {\n executeDomainPhase,\n loadDomainPrompt,\n parseDomainAgentResponse,\n inferViolationType,\n};\n","/**\n * sdlc_green Tool\n *\n * GREEN phase of TDD: Make the failing test pass\n *\n * Spawns a subagent that can ONLY edit implementation files (not tests).\n * Must run tests and return pass output as proof.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Arguments for sdlc_green tool\n */\nexport interface GreenArgs {\n redPhaseComplete: string;\n domainCheckPassed: string;\n}\n\n/**\n * Result from sdlc_green tool\n */\nexport interface GreenResult {\n success: boolean;\n implementationFiles?: string[];\n testsPassed?: boolean;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_green tool\n */\nexport function createGreenTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `GREEN phase of TDD: Make the failing test pass.\n\nThis tool spawns a subagent that writes the minimum implementation to pass the test. The agent:\n- Can ONLY edit implementation files (NOT test files)\n- Must use domain types created in the DOMAIN phase\n- Writes the MINIMUM code to pass the test\n- Must run tests and confirm they pass\n\nUse this AFTER the RED phase and DOMAIN review.\n\nRequired inputs:\n- redPhaseComplete: Test name + failure message from RED phase\n- domainCheckPassed: Confirmation that DOMAIN review passed`,\n\n args: {\n redPhaseComplete: tool.schema\n .string()\n .describe(\"Test name and failure message from the RED phase (proof of failing test)\"),\n domainCheckPassed: tool.schema\n .string()\n .describe(\"Confirmation from DOMAIN phase that types were reviewed/created\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGreenPhase(ctx, config, tracker, args as GreenArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeGreenPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: GreenArgs\n): Promise<GreenResult> {\n // Validate inputs\n if (!args.redPhaseComplete) {\n return {\n success: false,\n error: \"redPhaseComplete is required\",\n suggestion: \"Run sdlc_red first to create a failing test\",\n };\n }\n\n if (!args.domainCheckPassed) {\n return {\n success: false,\n error: \"domainCheckPassed is required\",\n suggestion: \"Run sdlc_domain after RED to review/create domain types\",\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"green\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete RED and DOMAIN phases before GREEN\",\n };\n }\n\n // Start GREEN phase in tracker\n const startResult = tracker.startGreen();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n suggestion: \"Ensure RED and DOMAIN phases completed successfully\",\n };\n }\n\n // Get RED phase output for context\n const redOutput = tracker.getLastRedOutput();\n if (!redOutput) {\n return {\n success: false,\n error: \"No RED phase output found\",\n suggestion: \"Run sdlc_red first to create a failing test\",\n };\n }\n\n // Load GREEN prompt\n const greenPrompt = await loadGreenPrompt(ctx.directory, redOutput, args);\n\n // Spawn GREEN agent\n const agentResult = await spawnGreenAgent(ctx, config, greenPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"GREEN agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Complete GREEN phase in tracker\n if (agentResult.implementationFiles) {\n tracker.completeGreen(agentResult.implementationFiles);\n }\n\n return {\n success: true,\n implementationFiles: agentResult.implementationFiles,\n testsPassed: agentResult.testsPassed,\n };\n}\n\ninterface RedOutput {\n testName: string;\n testFile: string;\n failureMessage: string;\n}\n\nasync function loadGreenPrompt(\n projectDir: string,\n redOutput: RedOutput,\n args: GreenArgs\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"green.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInGreenPrompt();\n }\n\n // Add context-specific instructions\n const contextInstructions = `\n## Current Context\n\n**Failing Test to Fix:**\n- File: ${redOutput.testFile}\n- Test: ${redOutput.testName}\n- Failure: ${redOutput.failureMessage}\n\n**Domain Types Available:**\n${args.domainCheckPassed}\n\nWrite the MINIMUM implementation to make this test pass.\nDo NOT add features that aren't tested.\nUse the domain types provided.\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInGreenPrompt(): string {\n return `# GREEN Phase Agent\n\nYou are the GREEN phase agent in TDD. Write the MINIMUM implementation to pass the test.\n\n## Rules\n1. ONLY edit implementation files (NOT test files)\n2. Write the SIMPLEST code that makes the test pass\n3. Use domain types from the DOMAIN phase\n4. Do NOT add features the test doesn't require\n5. Run tests to confirm they pass\n\n## Output Format\nAfter writing the implementation, run the tests and provide:\n- Implementation file(s) changed\n- Confirmation that the test passes\n- Summary of what was implemented\n\nRemember: Make it work, then make it right (refactoring comes later).`;\n}\n\ninterface AgentResult {\n success: boolean;\n implementationFiles?: string[];\n testsPassed?: boolean;\n error?: string;\n}\n\nasync function spawnGreenAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for GREEN agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD GREEN Phase - Make Test Pass\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create GREEN agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as GREEN subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"green\");\n\n try {\n // Send prompt to agent\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from GREEN agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in GREEN agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract implementation info\n const parsed = parseGreenAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `GREEN agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseGreenAgentResponse(content: string): Partial<AgentResult> {\n // Try to extract implementation info from agent response\n const filesMatch = content.match(/(?:Files?|Modified|Created)[^\\n]*:\\s*([^\\n]+)/gi);\n const passedMatch = content.match(/(?:PASS|passed|success)/i);\n\n const implementationFiles: string[] = [];\n if (filesMatch) {\n for (const match of filesMatch) {\n const files = match.replace(/.*:\\s*/, \"\").split(/[,\\s]+/);\n for (const file of files) {\n if (file.match(/\\.[jt]sx?$/)) {\n implementationFiles.push(file.trim());\n }\n }\n }\n }\n\n return {\n implementationFiles: implementationFiles.length > 0 ? implementationFiles : undefined,\n testsPassed: !!passedMatch,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeGreenPhase,\n loadGreenPrompt,\n parseGreenAgentResponse,\n};\n","/**\n * sdlc_red Tool\n *\n * RED phase of TDD: Write a failing test\n *\n * Spawns a subagent that can ONLY edit test files.\n * Must run tests and return failure output as proof.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Context for the RED phase\n */\nexport type RedContext = \"FIRST_TEST\" | \"CONTINUING\" | \"DRILL_DOWN\";\n\n/**\n * Arguments for sdlc_red tool\n */\nexport interface RedArgs {\n context: RedContext;\n acceptanceCriteria?: string;\n previousCycleProof?: string;\n}\n\n/**\n * Result from sdlc_red tool\n */\nexport interface RedResult {\n success: boolean;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_red tool\n */\nexport function createRedTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `RED phase of TDD: Write a failing test.\n\nThis tool spawns a subagent that writes a single failing test. The agent:\n- Can ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n- Must write ONE focused test\n- Must run the test and capture the failure\n- Returns failure proof for the GREEN phase\n\nUse this FIRST when starting TDD implementation.\n\nContext types:\n- FIRST_TEST: Starting a new feature/acceptance criterion\n- CONTINUING: Adding next test after a GREEN cycle\n- DRILL_DOWN: Breaking a complex test into smaller ones`,\n\n args: {\n context: tool.schema\n .enum([\"FIRST_TEST\", \"CONTINUING\", \"DRILL_DOWN\"])\n .describe(\n \"TDD context: FIRST_TEST for new feature, CONTINUING for next test, DRILL_DOWN for splitting\"\n ),\n acceptanceCriteria: tool.schema\n .string()\n .optional()\n .describe(\"The acceptance criteria being tested (required for FIRST_TEST)\"),\n previousCycleProof: tool.schema\n .string()\n .optional()\n .describe(\"Proof from previous GREEN cycle (required for CONTINUING)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeRedPhase(ctx, config, tracker, args as RedArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeRedPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: RedArgs\n): Promise<RedResult> {\n // Validate context requirements\n if (args.context === \"FIRST_TEST\" && !args.acceptanceCriteria) {\n return {\n success: false,\n error: \"acceptanceCriteria required for FIRST_TEST context\",\n suggestion: \"Provide the acceptance criteria you want to test\",\n };\n }\n\n if (args.context === \"CONTINUING\" && !args.previousCycleProof) {\n return {\n success: false,\n error: \"previousCycleProof required for CONTINUING context\",\n suggestion: \"Provide proof from the previous GREEN cycle\",\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"red\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete the current phase before starting RED\",\n };\n }\n\n // Start RED phase in tracker\n const startResult = tracker.startRed();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n };\n }\n\n // Load RED prompt\n const redPrompt = await loadRedPrompt(ctx.directory, args);\n\n // Spawn RED agent\n const agentResult = await spawnRedAgent(ctx, config, redPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"RED agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Complete RED phase in tracker\n if (agentResult.testName && agentResult.testFile && agentResult.failureMessage) {\n tracker.completeRed(agentResult.testName, agentResult.testFile, agentResult.failureMessage);\n }\n\n return {\n success: true,\n testName: agentResult.testName,\n testFile: agentResult.testFile,\n failureMessage: agentResult.failureMessage,\n };\n}\n\nasync function loadRedPrompt(projectDir: string, args: RedArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"red.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInRedPrompt();\n }\n\n // Add context-specific instructions\n let contextInstructions = \"\";\n\n switch (args.context) {\n case \"FIRST_TEST\":\n contextInstructions = `\n## Context: FIRST_TEST\n\nYou are writing the FIRST test for a new acceptance criterion.\n\n**Acceptance Criteria to Test:**\n${args.acceptanceCriteria}\n\nWrite a single, focused test that:\n1. Tests the smallest behavior from this acceptance criterion\n2. Uses domain language from the acceptance criteria\n3. Will FAIL because no implementation exists\n`;\n break;\n\n case \"CONTINUING\":\n contextInstructions = `\n## Context: CONTINUING\n\nYou are writing the NEXT test after a successful GREEN cycle.\n\n**Previous Cycle Proof:**\n${args.previousCycleProof}\n\nWrite a single, focused test that:\n1. Builds on the previous implementation\n2. Tests the next smallest behavior\n3. Will FAIL because this new behavior doesn't exist yet\n`;\n break;\n\n case \"DRILL_DOWN\":\n contextInstructions = `\n## Context: DRILL_DOWN\n\nYou are breaking down a complex test into smaller, focused tests.\n\nWrite smaller tests that:\n1. Each test ONE specific behavior\n2. Together cover the same scope as the original\n3. Are easier to implement incrementally\n`;\n break;\n }\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInRedPrompt(): string {\n return `# RED Phase Agent\n\nYou are the RED phase agent in TDD. Write a SINGLE failing test.\n\n## Rules\n1. ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n2. Write ONE focused test\n3. Test MUST fail (the feature doesn't exist yet)\n4. Use clear test names that describe behavior\n\n## Output Format\nAfter writing the test, run it and provide:\n- Test file path\n- Test name (describe > it)\n- Failure message\n\nThe test failure is EXPECTED and proves the test is valid.`;\n}\n\ninterface AgentResult {\n success: boolean;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n error?: string;\n}\n\nasync function spawnRedAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for RED agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD RED Phase - Write Failing Test\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create RED agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as RED subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"red\");\n\n try {\n // Send prompt to agent\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from RED agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in RED agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract test info\n const parsed = parseRedAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `RED agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseRedAgentResponse(content: string): Partial<AgentResult> {\n // Try to extract test info from agent response\n // Look for common patterns in test output\n\n const testFileMatch = content.match(/(?:File|Path):\\s*([^\\n]+\\.(?:test|spec)\\.[jt]sx?)/i);\n const testNameMatch = content.match(/(?:Test|Name):\\s*(.+?)(?:\\n|$)/i);\n const failureMatch = content.match(/(?:Failure|Error|FAIL)[^\\n]*:\\s*(.+?)(?:\\n\\n|\\n[A-Z]|$)/is);\n\n return {\n testFile: testFileMatch?.[1]?.trim(),\n testName: testNameMatch?.[1]?.trim(),\n failureMessage: failureMatch?.[1]?.trim() || \"Test failed (see agent output)\",\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeRedPhase,\n loadRedPrompt,\n parseRedAgentResponse,\n};\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, UpdateIssueStatusResult } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { moveIssueToStatus } from \"../utils/github-issues.js\";\n\nexport function createUpdateIssueStatusTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Update a GitHub issue's status on the project board.\n\nMoves the issue to the specified status column.`,\n\n args: {\n issueNumber: tool.schema.number().int().positive().describe(\"GitHub issue number\"),\n status: tool.schema.string().describe(\"Target status column name\"),\n },\n\n async execute(args): Promise<string> {\n const success = await moveIssueToStatus(ctx, config, args.issueNumber, args.status);\n\n if (success) {\n await tracker.updateIssueStatus(args.issueNumber, args.status);\n }\n\n const result: UpdateIssueStatusResult = success\n ? {\n success: true,\n issueNumber: args.issueNumber,\n newStatus: args.status,\n updatedAt: new Date().toISOString(),\n }\n : {\n success: false,\n issueNumber: args.issueNumber,\n error: \"Failed to move issue on project board\",\n suggestion: \"Check GitHub project configuration and status names\",\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","import type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport { createAdrTool } from \"./adr.js\";\nimport { createConfigTool } from \"./config.js\";\nimport { createDesignWorkflowTool } from \"./event-design-workflow.js\";\nimport { createDiscoverDomainTool } from \"./event-discover-domain.js\";\nimport { createGenerateGwtTool } from \"./event-generate-gwt.js\";\nimport { createValidateModelTool } from \"./event-validate-model.js\";\nimport { createGetContextTool } from \"./get-context.js\";\nimport { createGetIssueTool } from \"./get-issue.js\";\nimport { createListIssuesTool } from \"./list-issues.js\";\nimport { createRecallTool } from \"./memory-recall.js\";\nimport { createRememberTool } from \"./memory-remember.js\";\nimport { createMutationTool } from \"./mutation.js\";\nimport { createPartyDiscussionTool } from \"./party-discussion.js\";\nimport { createPartyReviewTool } from \"./party-review.js\";\nimport { createReviewPrTool } from \"./review-pr.js\";\nimport { createStoryReviewAnalyzeTool } from \"./story-review-analyze.js\";\nimport { createStoryReviewConsultTool } from \"./story-review-consult.js\";\nimport { createDomainTool } from \"./tdd-domain.js\";\nimport { createGreenTool } from \"./tdd-green.js\";\nimport { createRedTool } from \"./tdd-red.js\";\nimport { createUpdateIssueStatusTool } from \"./update-issue-status.js\";\n\n/**\n * Create all Sdlc tools\n *\n * @param ctx - Plugin context from OpenCode\n * @param tracker - Issue tracker instance\n * @param config - Sdlc configuration\n * @returns Object containing all tool definitions\n */\nexport function createTools(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Record<string, ToolDefinition> {\n // Create TDD cycle tracker if TDD is enabled\n // Use a hash of the directory as a stable session identifier\n const sessionId = `tdd-${Buffer.from(ctx.directory).toString(\"base64\").slice(0, 16)}`;\n const tddTracker = new TddCycleTracker(ctx.directory, sessionId);\n\n const tools: Record<string, ToolDefinition> = {\n sdlc_get_issue: createGetIssueTool(ctx, tracker, config),\n sdlc_list_issues: createListIssuesTool(ctx, config),\n sdlc_update_issue_status: createUpdateIssueStatusTool(ctx, tracker, config),\n sdlc_get_context: createGetContextTool(tracker, config),\n sdlc_config: createConfigTool(config),\n sdlc_story_review_analyze: createStoryReviewAnalyzeTool(ctx, config),\n sdlc_story_review_consult: createStoryReviewConsultTool(ctx, config),\n sdlc_party_discussion: createPartyDiscussionTool(ctx, config),\n // Event Modeling tools - always available for optional planning\n sdlc_discover_domain: createDiscoverDomainTool(ctx, config),\n sdlc_design_workflow: createDesignWorkflowTool(ctx, config),\n sdlc_generate_gwt: createGenerateGwtTool(ctx, config),\n sdlc_validate_model: createValidateModelTool(ctx, config),\n // Review System tools\n sdlc_review_pr: createReviewPrTool(ctx, config),\n sdlc_mutation: createMutationTool(ctx, config),\n sdlc_adr: createAdrTool(ctx, config),\n sdlc_party_review: createPartyReviewTool(ctx, config),\n // Memory tools\n sdlc_remember: createRememberTool(ctx, config),\n sdlc_recall: createRecallTool(ctx, config),\n };\n\n // Add TDD tools if TDD is enabled\n if (config.tdd?.enabled) {\n tools.sdlc_red = createRedTool(ctx, config, tddTracker);\n tools.sdlc_green = createGreenTool(ctx, config, tddTracker);\n tools.sdlc_domain = createDomainTool(ctx, config, tddTracker);\n }\n\n return tools;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { IssueTrackerState, OpenCodeTodo, TrackedIssue } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-tracker\");\n\n/**\n * Issue tracker that persists state across sessions.\n *\n * Tracks the current GitHub issue being worked on and history of status changes.\n */\nexport class IssueTracker {\n private state: IssueTrackerState;\n private stateFilePath: string;\n private projectDir: string;\n\n constructor(projectDir: string) {\n this.projectDir = projectDir;\n this.stateFilePath = CONFIG_PATHS.stateFile;\n this.state = {\n currentIssue: null,\n sessionId: crypto.randomUUID(),\n projectDir,\n history: [],\n };\n }\n\n async initialize(): Promise<void> {\n if (existsSync(this.stateFilePath)) {\n try {\n const content = await readFile(this.stateFilePath, \"utf-8\");\n const savedState = JSON.parse(content) as IssueTrackerState;\n\n if (savedState.projectDir === this.projectDir) {\n this.state = {\n ...savedState,\n sessionId: crypto.randomUUID(),\n };\n }\n } catch {\n // Ignore errors and start fresh\n }\n }\n }\n\n async setCurrentIssue(\n issueNumber: number,\n data: Omit<TrackedIssue, \"issueNumber\">\n ): Promise<void> {\n this.state.currentIssue = { issueNumber, ...data };\n this.addHistoryEntry(issueNumber, data.status);\n await this.saveState();\n }\n\n async updateIssueStatus(issueNumber: number, status: string): Promise<void> {\n if (this.state.currentIssue?.issueNumber === issueNumber) {\n this.state.currentIssue.status = status;\n if (status.toLowerCase() === \"done\") {\n this.state.currentIssue.completedAt = new Date().toISOString();\n }\n }\n this.addHistoryEntry(issueNumber, status);\n await this.saveState();\n }\n\n async updateIssueBody(body: string | null): Promise<void> {\n if (this.state.currentIssue) {\n this.state.currentIssue.body = body;\n await this.saveState();\n }\n }\n\n getCurrentIssue(): TrackedIssue | null {\n return this.state.currentIssue;\n }\n\n async getCurrentIssueContext(): Promise<string | null> {\n if (!this.state.currentIssue) return null;\n\n const issue = this.state.currentIssue;\n const recentHistory = this.state.history\n .slice(-5)\n .map((h) => `- #${h.issueNumber}: ${h.status} at ${h.timestamp}`)\n .join(\"\\n\");\n\n return `Current Issue: #${issue.issueNumber}\\nTitle: ${issue.title}\\nStatus: ${issue.status}\\nStarted: ${issue.startedAt}\\n${issue.completedAt ? `Completed: ${issue.completedAt}` : \"\"}\\n\\nRecent Activity:\\n${recentHistory}`;\n }\n\n getSessionId(): string {\n return this.state.sessionId;\n }\n\n getHistory(): IssueTrackerState[\"history\"] {\n return this.state.history;\n }\n\n getCurrentTodos(): OpenCodeTodo[] | null {\n return this.state.currentTodos || null;\n }\n\n async setCurrentTodos(todos: OpenCodeTodo[]): Promise<void> {\n this.state.currentTodos = todos;\n await this.saveState();\n }\n\n async clearTodos(): Promise<void> {\n this.state.currentTodos = undefined;\n await this.saveState();\n }\n\n private addHistoryEntry(issueNumber: number, status: string): void {\n this.state.history.push({\n issueNumber,\n status,\n timestamp: new Date().toISOString(),\n });\n\n if (this.state.history.length > 100) {\n this.state.history = this.state.history.slice(-100);\n }\n }\n\n private async saveState(): Promise<void> {\n try {\n const dir = dirname(this.stateFilePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.stateFilePath, JSON.stringify(this.state, null, 2), \"utf-8\");\n } catch (error) {\n log.warn(\"Failed to save tracker state\", { error });\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Zod validation schemas for OpenCode SDLC\n */\n\n// ============================================================================\n// Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for subscription configuration\n */\nexport const SubscriptionSchema = z.object({\n claude: z.object({\n enabled: z.boolean(),\n tier: z.enum([\"max5x\", \"max20x\", \"pro\", \"none\"]),\n }),\n openai: z.object({\n enabled: z.boolean(),\n }),\n google: z.object({\n enabled: z.boolean(),\n authMethod: z.enum([\"antigravity\", \"personal\", \"api\", \"none\"]),\n }),\n githubCopilot: z.object({\n enabled: z.boolean(),\n plan: z.enum([\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"]),\n enabledModels: z.array(z.string()).optional(),\n }),\n});\n\n// ============================================================================\n// GitHub Issues Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for GitHub project board statuses\n */\nexport const GitHubStatusSchema = z.enum([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"]);\n\n/**\n * Schema for GitHub Issues integration configuration\n */\nexport const GitHubConfigSchema = z.object({\n owner: z.string().describe(\"GitHub repository owner (user or org)\"),\n repo: z.string().describe(\"GitHub repository name\"),\n project: z.number().optional().describe(\"GitHub Project number for board tracking\"),\n statuses: z\n .array(GitHubStatusSchema)\n .default([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"])\n .describe(\"Project board column names\"),\n});\n\n// ============================================================================\n// TDD Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for TDD verbosity levels\n */\nexport const TddVerbositySchema = z.enum([\"silent\", \"brief\", \"explain\"]);\n\n/**\n * Schema for mutation testing configuration\n */\nexport const MutationTestingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable mutation testing\"),\n requiredScore: z\n .number()\n .min(0)\n .max(100)\n .default(80)\n .describe(\"Minimum mutation score required (0-100)\"),\n});\n\n/**\n * Schema for TDD cycle enforcement configuration\n */\nexport const TddConfigSchema = z.object({\n enabled: z.boolean().default(true).describe(\"Enable TDD cycle enforcement\"),\n verbosity: TddVerbositySchema.default(\"brief\").describe(\"TDD feedback verbosity\"),\n bypassPatterns: z\n .array(z.string())\n .default([\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"])\n .describe(\"File patterns that bypass TDD checks\"),\n mutationTesting: MutationTestingConfigSchema.default({\n enabled: false,\n requiredScore: 80,\n }),\n});\n\n// ============================================================================\n// Event Modeling Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Event Modeling integration configuration\n */\nexport const EventModelingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable Event Modeling workflow\"),\n outputPath: z.string().default(\"docs/event-model\").describe(\"Path to event model output files\"),\n});\n\n// ============================================================================\n// Git Workflow Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Git workflow types\n */\nexport const GitWorkflowSchema = z.enum([\"standard\", \"git-spice\"]);\n\n/**\n * Schema for Git integration configuration\n */\nexport const GitConfigSchema = z.object({\n workflow: GitWorkflowSchema.default(\"standard\").describe(\"Git workflow style\"),\n requireClean: z\n .boolean()\n .default(true)\n .describe(\"Require clean working directory before operations\"),\n worktrees: z.boolean().default(false).describe(\"Enable git worktrees for parallel work\"),\n});\n\n// ============================================================================\n// Feature Flags Schemas\n// ============================================================================\n\n/**\n * Schema for SDLC feature flags (v0.3.0+)\n */\nexport const FeaturesSchema = z.object({\n orchestratorOnly: z\n .boolean()\n .default(false)\n .describe(\"Main conversation delegates all file writes to agents\"),\n todoSync: z.boolean().default(true).describe(\"Auto-sync todos with GitHub issue checkboxes\"),\n partyReview: z.boolean().default(true).describe(\"Enable party review for architecture decisions\"),\n debuggingProtocol: z.boolean().default(true).describe(\"Enable debugging protocol with Oracle\"),\n memento: z.boolean().default(false).describe(\"Enable Memento MCP for persistent memory\"),\n notifications: z.boolean().default(true).describe(\"Show in-TUI notifications\"),\n lspTools: z.boolean().default(true).describe(\"Enable LSP tools for code intelligence\"),\n});\n\n/**\n * Schema for MCP configuration (v0.3.0+)\n */\nexport const McpsSchema = z.object({\n context7: z.boolean().default(true).describe(\"Context7 for library documentation\"),\n exa: z.boolean().default(true).describe(\"Exa for web search\"),\n grepApp: z.boolean().default(true).describe(\"grep.app for code search\"),\n memento: z.boolean().default(false).describe(\"Memento for persistent memory\"),\n});\n\n// ============================================================================\n// Legacy BMAD Configuration Schema (Deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfigSchema instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport const LegacyBmadConfigSchema = z.object({\n defaultTrack: z.enum([\"quick-flow\", \"enterprise\"]),\n autoStatusUpdate: z.boolean(),\n parallelIssueLimit: z.number().int().min(0).max(10),\n paths: z\n .object({\n prd: z.string().nullable().optional(),\n architecture: z.string().nullable().optional(),\n })\n .optional(),\n});\n\n/**\n * @deprecated Use FeaturesSchema instead. Legacy feature flags from pre-0.3.0.\n */\nexport const LegacyFeaturesSchema = z.object({\n bmadBridge: z.boolean(),\n autoStatus: z.boolean(),\n parallelExecution: z.boolean(),\n notifications: z.boolean(),\n contextMonitor: z.boolean(),\n commentChecker: z.boolean(),\n lspTools: z.boolean(),\n autoGitOperations: z.boolean().default(false),\n todoSync: z.boolean().default(true),\n});\n\n/**\n * @deprecated Use McpsSchema instead. Legacy MCP config from pre-0.3.0.\n */\nexport const LegacyMcpsSchema = z.object({\n context7: z.boolean(),\n exa: z.boolean(),\n grepApp: z.boolean(),\n});\n\n/**\n * Schema for LLM provider\n */\nexport const LLMProviderSchema = z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]);\n\n/**\n * Schema for agent routing configuration\n */\nexport const AgentRoutingSchema = z.object({\n requiresThinking: z.boolean().optional(),\n preferProvider: LLMProviderSchema.optional(),\n});\n\n/**\n * Schema for routing configuration\n */\nexport const RoutingConfigSchema = z.object({\n providerPriority: z.array(LLMProviderSchema),\n modelFamilyPriority: z.object({\n claude: z.array(LLMProviderSchema).optional(),\n gpt: z.array(LLMProviderSchema).optional(),\n gemini: z.array(LLMProviderSchema).optional(),\n }),\n agentOverrides: z.object({\n sisyphus: AgentRoutingSchema.optional(),\n oracle: AgentRoutingSchema.optional(),\n librarian: AgentRoutingSchema.optional(),\n frontend: AgentRoutingSchema.optional(),\n documentWriter: AgentRoutingSchema.optional(),\n multimodalLooker: AgentRoutingSchema.optional(),\n }),\n fallbackBehavior: z.object({\n autoFallback: z.boolean(),\n retryPeriodMs: z.number().min(0),\n notifyOnRateLimit: z.boolean(),\n }),\n});\n\n/**\n * Schema for thinking level\n */\nexport const ThinkingLevelSchema = z.enum([\"off\", \"low\", \"medium\", \"high\"]);\n\n/**\n * Schema for agent settings (temperature and thinking level)\n */\nexport const AgentSettingsSchema = z.object({\n temperature: z.number().min(0).max(1).optional(),\n thinkingLevel: ThinkingLevelSchema.optional(),\n});\n\n/**\n * Schema for custom model definition\n */\nexport const CustomModelDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n provider: z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]),\n description: z.string().optional(),\n capabilities: z\n .object({\n thinking: z.boolean().optional(),\n contextWindow: z.number().optional(),\n supportsTemperature: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * Schema for agent model assignments\n */\nexport const ModelsSchema = z.object({\n sisyphus: z.string().describe(\"Model for main orchestrator agent\"),\n oracle: z.string().describe(\"Model for debugging/reasoning agent\"),\n librarian: z.string().describe(\"Model for research/documentation agent\"),\n frontend: z.string().optional().describe(\"Model for UI/UX agent\"),\n documentWriter: z.string().optional().describe(\"Model for documentation generation agent\"),\n multimodalLooker: z.string().optional().describe(\"Model for image analysis agent\"),\n settings: z\n .object({\n sisyphus: AgentSettingsSchema.optional(),\n oracle: AgentSettingsSchema.optional(),\n librarian: AgentSettingsSchema.optional(),\n frontend: AgentSettingsSchema.optional(),\n documentWriter: AgentSettingsSchema.optional(),\n multimodalLooker: AgentSettingsSchema.optional(),\n overrides: z.record(z.string(), AgentSettingsSchema).optional(),\n })\n .optional(),\n custom: z.array(CustomModelDefinitionSchema).optional(),\n});\n\n/**\n * Complete SDLC configuration schema (v0.3.0+)\n *\n * Supports transitional state:\n * - New fields (github, tdd, eventModeling, git) are optional during migration\n * - Old field (bmad) is optional and deprecated\n * - Features/MCPs support both old and new structures via union\n */\nexport const SdlcConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n subscriptions: SubscriptionSchema,\n models: ModelsSchema,\n // New v0.3.0+ configuration (optional during migration)\n github: GitHubConfigSchema.optional(),\n tdd: TddConfigSchema.optional(),\n eventModeling: EventModelingConfigSchema.optional(),\n git: GitConfigSchema.optional(),\n // Legacy BMAD configuration (deprecated, optional for backward compatibility)\n bmad: LegacyBmadConfigSchema.optional(),\n // Features and MCPs support both old and new structures\n features: z.union([FeaturesSchema, LegacyFeaturesSchema]),\n mcps: z.union([McpsSchema, LegacyMcpsSchema]),\n routing: RoutingConfigSchema,\n});\n\n/**\n * @deprecated Alias for backward compatibility. Use LegacyBmadConfigSchema directly.\n */\nexport const BmadConfigSchema = LegacyBmadConfigSchema;\n\n// ============================================================================\n// Tool Argument Schemas\n// ============================================================================\n\n/**\n * Schema for sdlc_get_issue arguments\n */\nexport const GetIssueArgsSchema = z.object({\n issueNumber: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Specific GitHub issue number. If omitted, loads the next issue in Ready status.\"),\n});\n\n/**\n * Schema for sdlc_update_issue_status arguments\n */\nexport const UpdateIssueStatusArgsSchema = z.object({\n issueNumber: z.number().int().positive().describe(\"GitHub issue number\"),\n status: z.string().describe(\"New status (must match a column name in GitHub project statuses)\"),\n});\n\n/**\n * Schema for sdlc_list_issues arguments\n */\nexport const ListIssuesArgsSchema = z.object({\n status: z.string().optional().describe(\"Filter by status column name\"),\n limit: z.number().int().positive().optional().default(20).describe(\"Max issues to return\"),\n});\n\n/**\n * Schema for sdlc_get_context arguments\n */\nexport const GetContextArgsSchema = z.object({});\n\n/**\n * Schema for sdlc_parallel arguments\n */\nexport const ParallelArgsSchema = z.object({\n issueNumbers: z.array(z.number()).describe(\"Array of issue numbers to implement in parallel\"),\n maxConcurrent: z.number().int().min(1).max(5).optional().default(3),\n});\n\n/**\n * Schema for sdlc_config arguments\n */\nexport const ConfigArgsSchema = z.object({\n action: z.enum([\"get\", \"set\", \"reset\"]).describe(\"Configuration action to perform\"),\n key: z\n .string()\n .optional()\n .describe(\"Configuration key (dot notation, e.g., 'bmad.autoStatusUpdate')\"),\n value: z.unknown().optional().describe(\"Value to set (for 'set' action)\"),\n});\n\n// ============================================================================\n// Type Exports (inferred from schemas)\n// ============================================================================\n\n// Core configuration types\nexport type SubscriptionConfig = z.infer<typeof SubscriptionSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsSchema>;\nexport type RoutingConfigValidated = z.infer<typeof RoutingConfigSchema>;\nexport type SdlcConfigValidated = z.infer<typeof SdlcConfigSchema>;\n\n// New v0.3.0 configuration types\nexport type GitHubConfigValidated = z.infer<typeof GitHubConfigSchema>;\nexport type GitHubStatusValidated = z.infer<typeof GitHubStatusSchema>;\nexport type TddConfigValidated = z.infer<typeof TddConfigSchema>;\nexport type TddVerbosityValidated = z.infer<typeof TddVerbositySchema>;\nexport type MutationTestingConfigValidated = z.infer<typeof MutationTestingConfigSchema>;\nexport type EventModelingConfigValidated = z.infer<typeof EventModelingConfigSchema>;\nexport type GitConfigValidated = z.infer<typeof GitConfigSchema>;\nexport type GitWorkflowValidated = z.infer<typeof GitWorkflowSchema>;\nexport type FeaturesConfig = z.infer<typeof FeaturesSchema>;\nexport type McpsConfig = z.infer<typeof McpsSchema>;\n\n// Legacy/deprecated types (for backward compatibility)\n/** @deprecated Use GitHubConfigValidated instead */\nexport type BmadConfig = z.infer<typeof LegacyBmadConfigSchema>;\n","/**\n * Configuration loader for Sdlc plugin\n *\n * Loads SdlcConfig from project-local or global config files.\n * Project config takes priority over global config.\n * Uses Zod validation for type safety and clear error messages.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_PATHS, DEFAULTS } from \"../../shared/constants.js\";\nimport { SdlcConfigSchema } from \"../../shared/schemas.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"config-loader\");\n\n/**\n * Load Sdlc configuration from available config files.\n *\n * Priority order:\n * 1. Project-local: [projectDir]/.opencode/sdlc.json\n * 2. Global: ~/.config/opencode/sdlc.json\n * 3. Default values if no config found\n *\n * @param projectDir - The project directory to search for local config\n * @returns The merged Sdlc configuration\n */\nexport async function loadSdlcConfig(projectDir: string): Promise<SdlcConfig> {\n // Try project-local config first\n const localConfigPath = join(projectDir, \".opencode\", \"sdlc.json\");\n const localConfig = await loadConfigFile(localConfigPath);\n\n // Try global config\n const globalConfig = await loadConfigFile(CONFIG_PATHS.globalSdlcConfig);\n\n // Merge configs: local overrides global, both override defaults\n const merged = mergeConfigs(getDefaultConfig(), globalConfig, localConfig);\n\n // Validate the final merged config\n return validateConfig(merged);\n}\n\n/**\n * Load and parse a JSON config file\n */\nasync function loadConfigFile(filePath: string): Promise<Partial<SdlcConfig> | null> {\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Perform partial validation to catch obvious errors early\n // We don't require all fields since this is a partial config\n return validatePartialConfig(parsed, filePath);\n } catch (error) {\n if (error instanceof SyntaxError) {\n log.warn(\"Invalid JSON in config file\", { filePath, message: error.message });\n } else {\n log.warn(\"Failed to load config file\", { filePath, error });\n }\n return null;\n }\n}\n\n/**\n * Validate a partial config file and return it with warnings for invalid fields\n */\nfunction validatePartialConfig(config: unknown, filePath: string): Partial<SdlcConfig> | null {\n if (typeof config !== \"object\" || config === null) {\n log.warn(\"Config file must be an object\", { filePath });\n return null;\n }\n\n const result: Partial<SdlcConfig> = {};\n const configObj = config as Record<string, unknown>;\n\n // Validate and copy each top-level field\n if (\"version\" in configObj && typeof configObj.version === \"string\") {\n result.version = configObj.version;\n }\n\n if (\"$schema\" in configObj && typeof configObj.$schema === \"string\") {\n result.$schema = configObj.$schema;\n }\n\n // Validate subscriptions\n if (\"subscriptions\" in configObj && typeof configObj.subscriptions === \"object\") {\n const subs = configObj.subscriptions as Record<string, unknown>;\n result.subscriptions = {} as SdlcConfig[\"subscriptions\"];\n\n if (subs.claude && typeof subs.claude === \"object\") {\n const claude = subs.claude as Record<string, unknown>;\n result.subscriptions.claude = {\n enabled: typeof claude.enabled === \"boolean\" ? claude.enabled : false,\n tier: isValidTier(claude.tier) ? claude.tier : \"none\",\n };\n }\n\n if (subs.openai && typeof subs.openai === \"object\") {\n const openai = subs.openai as Record<string, unknown>;\n result.subscriptions.openai = {\n enabled: typeof openai.enabled === \"boolean\" ? openai.enabled : false,\n };\n }\n\n if (subs.google && typeof subs.google === \"object\") {\n const google = subs.google as Record<string, unknown>;\n result.subscriptions.google = {\n enabled: typeof google.enabled === \"boolean\" ? google.enabled : false,\n authMethod: isValidAuthMethod(google.authMethod) ? google.authMethod : \"none\",\n };\n }\n\n if (subs.githubCopilot && typeof subs.githubCopilot === \"object\") {\n const copilot = subs.githubCopilot as Record<string, unknown>;\n result.subscriptions.githubCopilot = {\n enabled: typeof copilot.enabled === \"boolean\" ? copilot.enabled : false,\n plan: isValidCopilotPlan(copilot.plan) ? copilot.plan : \"none\",\n enabledModels: Array.isArray(copilot.enabledModels)\n ? copilot.enabledModels.filter((m): m is string => typeof m === \"string\")\n : undefined,\n };\n }\n }\n\n // Validate models\n if (\"models\" in configObj && typeof configObj.models === \"object\") {\n const models = configObj.models as Record<string, unknown>;\n result.models = {} as SdlcConfig[\"models\"];\n\n const modelKeys = [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n\n for (const key of modelKeys) {\n if (key in models && typeof models[key] === \"string\") {\n (result.models as unknown as Record<string, string>)[key] = models[key] as string;\n }\n }\n\n if (\"settings\" in models && typeof models.settings === \"object\" && models.settings !== null) {\n result.models.settings = validateModelSettings(models.settings as Record<string, unknown>);\n }\n\n if (\"custom\" in models && Array.isArray(models.custom)) {\n result.models.custom = validateCustomModels(models.custom);\n }\n }\n\n // Validate bmad (legacy, optional)\n if (\"bmad\" in configObj && typeof configObj.bmad === \"object\") {\n const bmad = configObj.bmad as Record<string, unknown>;\n const bmadConfig: Partial<NonNullable<SdlcConfig[\"bmad\"]>> = {};\n\n if (isValidTrack(bmad.defaultTrack) && bmad.defaultTrack !== \"bmad-method\") {\n bmadConfig.defaultTrack = bmad.defaultTrack;\n }\n if (typeof bmad.autoStatusUpdate === \"boolean\") {\n bmadConfig.autoStatusUpdate = bmad.autoStatusUpdate;\n }\n if (typeof bmad.parallelIssueLimit === \"number\") {\n bmadConfig.parallelIssueLimit = Math.max(0, Math.min(10, bmad.parallelIssueLimit));\n }\n\n // Only set bmad if we have valid fields\n if (Object.keys(bmadConfig).length > 0) {\n result.bmad = bmadConfig as NonNullable<SdlcConfig[\"bmad\"]>;\n }\n }\n\n // Validate github (new v0.3.0+, optional)\n if (\"github\" in configObj && typeof configObj.github === \"object\") {\n const github = configObj.github as Record<string, unknown>;\n if (typeof github.owner === \"string\" && typeof github.repo === \"string\") {\n result.github = {\n owner: github.owner,\n repo: github.repo,\n project: typeof github.project === \"number\" ? github.project : undefined,\n statuses: Array.isArray(github.statuses)\n ? github.statuses\n : [\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"],\n };\n }\n }\n\n // Validate tdd (new v0.3.0+, optional)\n if (\"tdd\" in configObj && typeof configObj.tdd === \"object\") {\n const tdd = configObj.tdd as Record<string, unknown>;\n result.tdd = {\n enabled: typeof tdd.enabled === \"boolean\" ? tdd.enabled : true,\n verbosity: isValidTddVerbosity(tdd.verbosity) ? tdd.verbosity : \"brief\",\n bypassPatterns: Array.isArray(tdd.bypassPatterns)\n ? tdd.bypassPatterns\n : [\"*.config.*\", \"*.json\", \"*.md\"],\n mutationTesting: {\n enabled:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.enabled === \"boolean\"\n ? ((tdd.mutationTesting as Record<string, unknown>).enabled as boolean)\n : false,\n requiredScore:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.requiredScore === \"number\"\n ? ((tdd.mutationTesting as Record<string, unknown>).requiredScore as number)\n : 80,\n },\n };\n }\n\n // Validate features (supports both old and new structures)\n if (\"features\" in configObj && typeof configObj.features === \"object\") {\n const features = configObj.features as Record<string, unknown>;\n\n // Check if this is new or legacy features structure\n const isNewFeatures = \"orchestratorOnly\" in features;\n\n if (isNewFeatures) {\n // New features structure\n const newFeatures: Record<string, boolean> = {};\n for (const key of [\n \"orchestratorOnly\",\n \"todoSync\",\n \"partyReview\",\n \"debuggingProtocol\",\n \"memento\",\n \"notifications\",\n \"lspTools\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n newFeatures[key] = features[key] as boolean;\n }\n }\n result.features = newFeatures as unknown as SdlcConfig[\"features\"];\n } else {\n // Legacy features structure\n const legacyFeatures: Record<string, boolean> = {};\n for (const key of [\n \"bmadBridge\",\n \"autoStatus\",\n \"parallelExecution\",\n \"notifications\",\n \"contextMonitor\",\n \"commentChecker\",\n \"lspTools\",\n \"autoGitOperations\",\n \"todoSync\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n legacyFeatures[key] = features[key] as boolean;\n }\n }\n result.features = legacyFeatures as unknown as SdlcConfig[\"features\"];\n }\n }\n\n // Validate mcps (supports both old and new structures)\n if (\"mcps\" in configObj && typeof configObj.mcps === \"object\") {\n const mcps = configObj.mcps as Record<string, unknown>;\n const mcpConfig: Record<string, boolean> = {};\n\n // Support both old and new MCP keys\n for (const key of [\"context7\", \"exa\", \"grepApp\", \"memento\"]) {\n if (key in mcps && typeof mcps[key] === \"boolean\") {\n mcpConfig[key] = mcps[key] as boolean;\n }\n }\n result.mcps = mcpConfig as unknown as SdlcConfig[\"mcps\"];\n }\n\n return result;\n}\n\n/**\n * Type guard for valid Claude tier\n */\nfunction isValidTier(value: unknown): value is \"max5x\" | \"max20x\" | \"pro\" | \"none\" {\n return typeof value === \"string\" && [\"max5x\", \"max20x\", \"pro\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid Google auth method\n */\nfunction isValidAuthMethod(value: unknown): value is \"antigravity\" | \"personal\" | \"api\" | \"none\" {\n return typeof value === \"string\" && [\"antigravity\", \"personal\", \"api\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid GitHub Copilot plan\n */\nfunction isValidCopilotPlan(\n value: unknown\n): value is \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\" {\n return (\n typeof value === \"string\" &&\n [\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"].includes(value)\n );\n}\n\n/**\n * Type guard for valid BMAD track\n */\nfunction isValidTrack(value: unknown): value is \"quick-flow\" | \"bmad-method\" | \"enterprise\" {\n return typeof value === \"string\" && [\"quick-flow\", \"bmad-method\", \"enterprise\"].includes(value);\n}\n\nfunction isValidThinkingLevel(value: unknown): value is \"off\" | \"low\" | \"medium\" | \"high\" {\n return typeof value === \"string\" && [\"off\", \"low\", \"medium\", \"high\"].includes(value);\n}\n\n/**\n * Type guard for valid TDD verbosity level\n */\nfunction isValidTddVerbosity(value: unknown): value is \"silent\" | \"brief\" | \"explain\" {\n return typeof value === \"string\" && [\"silent\", \"brief\", \"explain\"].includes(value);\n}\n\nfunction isValidProvider(\n value: unknown\n): value is \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\" {\n return (\n typeof value === \"string\" && [\"anthropic\", \"openai\", \"google\", \"github-copilot\"].includes(value)\n );\n}\n\nfunction validateAgentSettings(settings: unknown): SdlcConfig[\"models\"][\"settings\"] {\n if (typeof settings !== \"object\" || settings === null) {\n return undefined;\n }\n\n const result: SdlcConfig[\"models\"][\"settings\"] = {};\n const settingsObj = settings as Record<string, unknown>;\n const agentKeys = [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n\n for (const key of agentKeys) {\n if (key in settingsObj && typeof settingsObj[key] === \"object\" && settingsObj[key] !== null) {\n const agentSetting = settingsObj[key] as Record<string, unknown>;\n const validated: { temperature?: number; thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\" } =\n {};\n\n if (\n typeof agentSetting.temperature === \"number\" &&\n agentSetting.temperature >= 0 &&\n agentSetting.temperature <= 2\n ) {\n validated.temperature = agentSetting.temperature;\n }\n\n if (isValidThinkingLevel(agentSetting.thinkingLevel)) {\n validated.thinkingLevel = agentSetting.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result[key] = validated;\n }\n }\n }\n\n if (\n \"overrides\" in settingsObj &&\n typeof settingsObj.overrides === \"object\" &&\n settingsObj.overrides !== null\n ) {\n const overrides = settingsObj.overrides as Record<string, unknown>;\n result.overrides = {};\n\n for (const [modelId, modelSettings] of Object.entries(overrides)) {\n if (typeof modelSettings === \"object\" && modelSettings !== null) {\n const ms = modelSettings as Record<string, unknown>;\n const validated: {\n temperature?: number;\n thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\";\n } = {};\n\n if (typeof ms.temperature === \"number\" && ms.temperature >= 0 && ms.temperature <= 2) {\n validated.temperature = ms.temperature;\n }\n\n if (isValidThinkingLevel(ms.thinkingLevel)) {\n validated.thinkingLevel = ms.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result.overrides[modelId] = validated;\n }\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction validateModelSettings(\n settings: Record<string, unknown>\n): SdlcConfig[\"models\"][\"settings\"] {\n return validateAgentSettings(settings);\n}\n\nfunction validateCustomModels(models: unknown[]): SdlcConfig[\"models\"][\"custom\"] {\n const validated: SdlcConfig[\"models\"][\"custom\"] = [];\n\n for (const model of models) {\n if (typeof model !== \"object\" || model === null) continue;\n\n const m = model as Record<string, unknown>;\n if (typeof m.id !== \"string\" || typeof m.name !== \"string\" || !isValidProvider(m.provider)) {\n continue;\n }\n\n const customModel: {\n id: string;\n name: string;\n provider: \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n description?: string;\n capabilities?: { thinking?: boolean; contextWindow?: number; supportsTemperature?: boolean };\n } = {\n id: m.id,\n name: m.name,\n provider: m.provider,\n };\n\n if (typeof m.description === \"string\") {\n customModel.description = m.description;\n }\n\n if (typeof m.capabilities === \"object\" && m.capabilities !== null) {\n const caps = m.capabilities as Record<string, unknown>;\n customModel.capabilities = {};\n\n if (typeof caps.thinking === \"boolean\") {\n customModel.capabilities.thinking = caps.thinking;\n }\n if (typeof caps.contextWindow === \"number\") {\n customModel.capabilities.contextWindow = caps.contextWindow;\n }\n if (typeof caps.supportsTemperature === \"boolean\") {\n customModel.capabilities.supportsTemperature = caps.supportsTemperature;\n }\n }\n\n validated.push(customModel);\n }\n\n return validated.length > 0 ? validated : undefined;\n}\n\n/**\n * Validate the final merged config using Zod schema\n */\nfunction validateConfig(config: SdlcConfig): SdlcConfig {\n const result = SdlcConfigSchema.safeParse(config);\n\n if (!result.success) {\n // Log validation errors but don't fail - use defaults for invalid fields\n log.warn(\"Configuration validation warnings\", {\n errors: result.error.errors.map((e) => ({\n path: e.path.join(\".\"),\n message: e.message,\n })),\n });\n\n // Return the original config since we already have defaults\n // The individual fields will be used even if some are invalid\n return config;\n }\n\n return result.data;\n}\n\n/**\n * Get default configuration values\n */\nfunction getDefaultConfig(): SdlcConfig {\n return {\n version: \"0.0.1\",\n subscriptions: {\n claude: { enabled: false, tier: \"none\" },\n openai: { enabled: false },\n google: { enabled: false, authMethod: \"none\" },\n githubCopilot: { enabled: false, plan: \"none\" },\n },\n models: {\n sisyphus: \"anthropic/claude-sonnet-4\",\n oracle: \"anthropic/claude-sonnet-4\",\n librarian: \"anthropic/claude-sonnet-4\",\n },\n bmad: {\n defaultTrack: \"quick-flow\",\n autoStatusUpdate: false,\n parallelIssueLimit: 0,\n },\n features: { ...DEFAULTS.features },\n mcps: { ...DEFAULTS.mcps },\n routing: {\n providerPriority: [\"anthropic\", \"openai\", \"google\", \"github-copilot\"],\n modelFamilyPriority: {\n claude: [\"anthropic\", \"github-copilot\"],\n gpt: [\"openai\", \"github-copilot\"],\n gemini: [\"google\", \"github-copilot\"],\n },\n agentOverrides: {\n oracle: {\n requiresThinking: true,\n },\n },\n fallbackBehavior: {\n autoFallback: false,\n retryPeriodMs: 300000,\n notifyOnRateLimit: true,\n },\n },\n };\n}\n\n/**\n * Deep merge multiple config objects\n * Later configs override earlier ones\n */\nfunction mergeConfigs(...configs: (Partial<SdlcConfig> | null)[]): SdlcConfig {\n const result = getDefaultConfig();\n\n for (const config of configs) {\n if (!config) continue;\n\n // Merge top-level primitives\n if (config.version) result.version = config.version;\n\n // Merge subscriptions\n if (config.subscriptions) {\n if (config.subscriptions.claude) {\n result.subscriptions.claude = {\n ...result.subscriptions.claude,\n ...config.subscriptions.claude,\n };\n }\n if (config.subscriptions.openai) {\n result.subscriptions.openai = {\n ...result.subscriptions.openai,\n ...config.subscriptions.openai,\n };\n }\n if (config.subscriptions.google) {\n result.subscriptions.google = {\n ...result.subscriptions.google,\n ...config.subscriptions.google,\n };\n }\n if (config.subscriptions.githubCopilot) {\n result.subscriptions.githubCopilot = {\n ...result.subscriptions.githubCopilot,\n ...config.subscriptions.githubCopilot,\n };\n }\n }\n\n // Merge models (deep merge)\n if (config.models) {\n if (config.models.sisyphus !== undefined) result.models.sisyphus = config.models.sisyphus;\n if (config.models.oracle !== undefined) result.models.oracle = config.models.oracle;\n if (config.models.librarian !== undefined) result.models.librarian = config.models.librarian;\n if (config.models.frontend !== undefined) result.models.frontend = config.models.frontend;\n if (config.models.documentWriter !== undefined)\n result.models.documentWriter = config.models.documentWriter;\n if (config.models.multimodalLooker !== undefined)\n result.models.multimodalLooker = config.models.multimodalLooker;\n\n if (config.models.settings !== undefined) {\n result.models.settings = result.models.settings || {};\n const resultSettings = result.models.settings;\n const configSettings = config.models.settings;\n\n for (const agentKey of [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const) {\n if (configSettings[agentKey] !== undefined) {\n resultSettings[agentKey] = {\n ...(resultSettings[agentKey] || {}),\n ...configSettings[agentKey],\n };\n }\n }\n\n if (configSettings.overrides !== undefined) {\n resultSettings.overrides = {\n ...(resultSettings.overrides || {}),\n ...configSettings.overrides,\n };\n }\n }\n\n if (config.models.custom !== undefined) {\n result.models.custom = config.models.custom;\n }\n }\n\n // Merge bmad settings\n if (config.bmad) {\n result.bmad = { ...result.bmad, ...config.bmad };\n }\n\n // Merge features\n if (config.features) {\n result.features = { ...result.features, ...config.features };\n }\n\n // Merge mcps\n if (config.mcps) {\n result.mcps = { ...result.mcps, ...config.mcps };\n }\n\n // Merge routing (deep merge)\n if (config.routing) {\n if (config.routing.providerPriority !== undefined) {\n result.routing.providerPriority = config.routing.providerPriority;\n }\n\n if (config.routing.modelFamilyPriority !== undefined) {\n result.routing.modelFamilyPriority = {\n ...result.routing.modelFamilyPriority,\n ...config.routing.modelFamilyPriority,\n };\n }\n\n if (config.routing.agentOverrides !== undefined) {\n result.routing.agentOverrides = {\n ...result.routing.agentOverrides,\n ...config.routing.agentOverrides,\n };\n }\n\n if (config.routing.fallbackBehavior !== undefined) {\n result.routing.fallbackBehavior = {\n ...result.routing.fallbackBehavior,\n ...config.routing.fallbackBehavior,\n };\n }\n }\n }\n\n return result;\n}\n","/**\n * OpenCode SDLC Plugin\n *\n * The main OpenCode plugin that provides SDLC integration tools and hooks.\n */\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { createCompactionHook, createSessionHooks, createToolHooks } from \"./hooks/index.js\";\nimport { createTools } from \"./tools/index.js\";\nimport { IssueTracker } from \"./tracker/issue-tracker.js\";\nimport { loadSdlcConfig } from \"./utils/config-loader.js\";\nimport { createPluginLogger } from \"./utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"plugin-init\");\n\n/**\n * OpenCode SDLC plugin factory.\n *\n * Provides:\n * - Custom tools for GitHub issue workflow\n * - Session hooks for context tracking\n * - Tool execution hooks for status updates\n * - Compaction hooks to preserve issue context\n */\nexport const OpenCodeSdlc: Plugin = async (ctx) => {\n const { directory } = ctx;\n\n log.info(\"OpenCode SDLC plugin loading\", {\n directory,\n timestamp: new Date().toISOString(),\n });\n\n // Load Sdlc configuration (project-local takes priority over global)\n const config = await loadSdlcConfig(directory);\n\n // Initialize issue tracker for session state persistence\n const tracker = new IssueTracker(directory);\n await tracker.initialize();\n\n // Create tools\n const tools = createTools(ctx, tracker, config);\n\n // Create hooks\n const sessionHooks = createSessionHooks(ctx, tracker, config);\n const toolHooks = createToolHooks(ctx, tracker, config);\n const compactionHook = createCompactionHook(tracker, config);\n\n return {\n // Custom tools for SDLC integration\n tool: tools,\n\n // Session event handlers\n event: sessionHooks,\n\n // Tool execution hooks\n \"tool.execute.before\": toolHooks.before,\n \"tool.execute.after\": toolHooks.after,\n\n // Compaction hook to preserve issue context\n \"experimental.session.compacting\": compactionHook,\n };\n};\n\n// Default export for OpenCode plugin loader\nexport default OpenCodeSdlc;\n"]}
|