fifony 0.1.39 → 0.1.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/app/dist/assets/{CommandPalette--xFIYira.js → CommandPalette-dMSFpGLm.js} +1 -1
  2. package/app/dist/assets/{KeyboardShortcutsHelp-BtrclGbX.js → KeyboardShortcutsHelp-CH5aYlDe.js} +1 -1
  3. package/app/dist/assets/{OnboardingWizard-AdxAh1n0.js → OnboardingWizard-CdJHsRny.js} +1 -1
  4. package/app/dist/assets/{analytics.lazy-DaMIOiTI.js → analytics.lazy-CKu4136R.js} +1 -1
  5. package/app/dist/assets/{index-BWB0OQnx.css → index-BatA8x-K.css} +1 -1
  6. package/app/dist/assets/index-C13WwYFD.js +54 -0
  7. package/app/dist/index.html +2 -2
  8. package/app/dist/service-worker.js +1 -1
  9. package/dist/agent/run-local.js +5 -5
  10. package/dist/{agent-AAT7OHAL.js → agent-KDPOZCI5.js} +6 -6
  11. package/dist/{chunk-AVSRIV47.js → chunk-3QL4QAQ5.js} +22 -14
  12. package/dist/{chunk-T2YJOZ6N.js → chunk-EPY5TTQK.js} +6 -29
  13. package/dist/{chunk-DWMY2HBG.js → chunk-LYAI5RPK.js} +428 -145
  14. package/dist/{chunk-UNYIR5AK.js → chunk-O3FGX4J6.js} +29 -13
  15. package/dist/{chunk-WBOBY75G.js → chunk-UXXUTDGV.js} +3 -3
  16. package/dist/cli.js +5 -5
  17. package/dist/issue-runner-YZM6WQMY.js +15 -0
  18. package/dist/{issue-state-machine-TEIICCAA.js → issue-state-machine-KOZE5JWX.js} +4 -4
  19. package/dist/{issues-JPMKO2EE.js → issues-7HQC7OIN.js} +6 -6
  20. package/dist/mcp/server.js +1 -1
  21. package/dist/{queue-workers-5JOCROD6.js → queue-workers-ZEZHDX7M.js} +2 -2
  22. package/dist/{scheduler-GAO2MXGZ.js → scheduler-4R4ZAF25.js} +6 -6
  23. package/dist/{store-3YSID6N2.js → store-FNUWCFOX.js} +6 -6
  24. package/dist/{workspace-ZD5H6YOL.js → workspace-AOHHNWL5.js} +3 -3
  25. package/package.json +1 -1
  26. package/app/dist/assets/index-D5rsr1We.js +0 -54
  27. package/dist/issue-runner-JSHZGTKQ.js +0 -15
@@ -20,12 +20,12 @@
20
20
  <link rel="icon" href="/assets/icon-32.png" sizes="32x32" type="image/png" />
21
21
  <link rel="icon" href="/assets/icon-16.png" sizes="16x16" type="image/png" />
22
22
  <link rel="apple-touch-icon" href="/assets/apple-touch-icon.png" />
23
- <script type="module" crossorigin src="/assets/assets/index-D5rsr1We.js"></script>
23
+ <script type="module" crossorigin src="/assets/assets/index-C13WwYFD.js"></script>
24
24
  <link rel="modulepreload" crossorigin href="/assets/assets/rolldown-runtime-Dw2cE7zH.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/assets/api-ChEctgc5.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/assets/vendor-DkWeBvNl.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/assets/createLucideIcon-R47sXufx.js">
28
- <link rel="stylesheet" crossorigin href="/assets/assets/index-BWB0OQnx.css">
28
+ <link rel="stylesheet" crossorigin href="/assets/assets/index-BatA8x-K.css">
29
29
  </head>
30
30
  <body>
31
31
  <div id="root"></div>
@@ -1,4 +1,4 @@
1
- const CACHE_VERSION = "1774287064241";
1
+ const CACHE_VERSION = "1774372039411";
2
2
  const CORE_CACHE = `fifony-core-${CACHE_VERSION}`;
3
3
  const ASSET_CACHE = `fifony-assets-${CACHE_VERSION}`;
4
4
  const APP_SHELL_ROUTES = ["/kanban", "/issues", "/agents", "/settings", "/onboarding"];
@@ -23,17 +23,17 @@ import {
23
23
  startApiServer,
24
24
  syncRuntimeConfigSettings,
25
25
  validateConfig
26
- } from "../chunk-DWMY2HBG.js";
26
+ } from "../chunk-LYAI5RPK.js";
27
27
  import {
28
28
  cleanTerminalWorkspaces,
29
29
  initQueueWorkers,
30
30
  recoverOrphans,
31
31
  recoverState,
32
32
  stopQueueWorkers
33
- } from "../chunk-AVSRIV47.js";
33
+ } from "../chunk-3QL4QAQ5.js";
34
34
  import {
35
35
  computeMetrics
36
- } from "../chunk-WBOBY75G.js";
36
+ } from "../chunk-UXXUTDGV.js";
37
37
  import {
38
38
  detectAvailableProviders,
39
39
  detectDefaultBranch,
@@ -41,7 +41,7 @@ import {
41
41
  getProviderDefaultCommand,
42
42
  resolveDefaultProvider,
43
43
  setSkipSource
44
- } from "../chunk-UNYIR5AK.js";
44
+ } from "../chunk-O3FGX4J6.js";
45
45
  import {
46
46
  initLogger,
47
47
  logger
@@ -51,7 +51,7 @@ import {
51
51
  fail,
52
52
  now,
53
53
  parseIntArg
54
- } from "../chunk-T2YJOZ6N.js";
54
+ } from "../chunk-EPY5TTQK.js";
55
55
  import {
56
56
  CLI_ARGS,
57
57
  PACKAGE_ROOT,
@@ -15,9 +15,9 @@ import {
15
15
  runIssueOnce,
16
16
  runPlanningJob,
17
17
  tryParseJsonOutput
18
- } from "./chunk-DWMY2HBG.js";
19
- import "./chunk-AVSRIV47.js";
20
- import "./chunk-WBOBY75G.js";
18
+ } from "./chunk-LYAI5RPK.js";
19
+ import "./chunk-3QL4QAQ5.js";
20
+ import "./chunk-UXXUTDGV.js";
21
21
  import {
22
22
  buildPrompt,
23
23
  buildProviderBasePrompt,
@@ -34,9 +34,9 @@ import {
34
34
  runCommandWithTimeout,
35
35
  runHook,
36
36
  shouldSkipMergePath
37
- } from "./chunk-UNYIR5AK.js";
37
+ } from "./chunk-O3FGX4J6.js";
38
38
  import "./chunk-DVU3CXWA.js";
39
- import "./chunk-T2YJOZ6N.js";
39
+ import "./chunk-EPY5TTQK.js";
40
40
  import "./chunk-37N5OFHM.js";
41
41
  export {
42
42
  addTokenUsage,
@@ -71,4 +71,4 @@ export {
71
71
  shouldSkipMergePath,
72
72
  tryParseJsonOutput
73
73
  };
74
- //# sourceMappingURL=agent-AAT7OHAL.js.map
74
+ //# sourceMappingURL=agent-KDPOZCI5.js.map
@@ -26,7 +26,7 @@ async function initQueueWorkers(state) {
26
26
  }, 3e4);
27
27
  persistInterval = setInterval(() => {
28
28
  if (!active || !runtimeState) return;
29
- import("./store-3YSID6N2.js").then(
29
+ import("./store-FNUWCFOX.js").then(
30
30
  ({ persistState }) => persistState(runtimeState).catch(() => {
31
31
  })
32
32
  ).catch(() => {
@@ -116,11 +116,11 @@ function sortQueue() {
116
116
  }
117
117
  async function dispatchPlan(issue) {
118
118
  logger.info({ issueId: issue.id, identifier: issue.identifier }, "[Queue] Dispatching plan job");
119
- const { runPlanningJob } = await import("./issue-runner-JSHZGTKQ.js");
119
+ const { runPlanningJob } = await import("./issue-runner-YZM6WQMY.js");
120
120
  await runPlanningJob(runtimeState, issue);
121
121
  }
122
122
  async function dispatchExecute(issue) {
123
- const { runIssueOnce } = await import("./issue-runner-JSHZGTKQ.js");
123
+ const { runIssueOnce } = await import("./issue-runner-YZM6WQMY.js");
124
124
  while (active && runtimeState) {
125
125
  const current = getCurrentIssue(issue.id);
126
126
  if (!current || current.state !== "Queued" && current.state !== "Running") break;
@@ -130,12 +130,12 @@ async function dispatchExecute(issue) {
130
130
  }
131
131
  async function dispatchReview(issue) {
132
132
  logger.info({ issueId: issue.id, identifier: issue.identifier }, "[Queue] Dispatching review job");
133
- const { runIssueOnce } = await import("./issue-runner-JSHZGTKQ.js");
133
+ const { runIssueOnce } = await import("./issue-runner-YZM6WQMY.js");
134
134
  await runIssueOnce(runtimeState, issue, running);
135
135
  }
136
136
  async function checkStaleIssues() {
137
137
  if (!runtimeState) return;
138
- const { ensureNotStale } = await import("./scheduler-GAO2MXGZ.js");
138
+ const { ensureNotStale } = await import("./scheduler-4R4ZAF25.js");
139
139
  await ensureNotStale(runtimeState, runtimeState.config.staleInProgressTimeoutMs);
140
140
  }
141
141
  var draining = false;
@@ -181,12 +181,14 @@ async function enqueue(issue, job) {
181
181
  return;
182
182
  }
183
183
  queue.push({ issueId: issue.id, job, enqueuedAt: Date.now() });
184
- drain().catch((err) => logger.error({ err }, "[Queue] Drain loop error"));
184
+ setImmediate(() => {
185
+ drain().catch((err) => logger.error({ err }, "[Queue] Drain loop error"));
186
+ });
185
187
  }
186
188
  async function recoverState() {
187
189
  if (!runtimeState) return;
188
190
  try {
189
- const { getIssueStateMachinePlugin, ISSUE_STATE_MACHINE_ID } = await import("./issue-state-machine-TEIICCAA.js");
191
+ const { getIssueStateMachinePlugin, ISSUE_STATE_MACHINE_ID } = await import("./issue-state-machine-KOZE5JWX.js");
190
192
  const fsmPlugin = getIssueStateMachinePlugin();
191
193
  if (fsmPlugin?.getState) {
192
194
  for (const issue of runtimeState.issues) {
@@ -204,8 +206,14 @@ async function recoverState() {
204
206
  }
205
207
  for (const issue of runtimeState.issues) {
206
208
  try {
207
- if (issue.state === "Planning" && issue.planningStatus !== "planning") {
208
- await enqueue(issue, "plan");
209
+ if (issue.state === "Planning") {
210
+ if (issue.planningStatus === "planning") {
211
+ logger.info({ issueId: issue.id, identifier: issue.identifier }, "[Queue] Clearing stale planningStatus from previous session");
212
+ issue.planningStatus = "idle";
213
+ }
214
+ if (!issue.plan) {
215
+ await enqueue(issue, "plan");
216
+ }
209
217
  } else if (issue.state === "Queued" || issue.state === "Running") {
210
218
  await enqueue(issue, "execute");
211
219
  } else if (issue.state === "Reviewing") {
@@ -218,9 +226,9 @@ async function recoverState() {
218
226
  }
219
227
  async function recoverOrphans() {
220
228
  if (!runtimeState) return;
221
- const { isAgentStillRunning, cleanStalePidFile } = await import("./agent-AAT7OHAL.js");
222
- const { executeTransition } = await import("./issue-state-machine-TEIICCAA.js");
223
- const { addEvent } = await import("./issues-JPMKO2EE.js");
229
+ const { isAgentStillRunning, cleanStalePidFile } = await import("./agent-KDPOZCI5.js");
230
+ const { executeTransition } = await import("./issue-state-machine-KOZE5JWX.js");
231
+ const { addEvent } = await import("./issues-7HQC7OIN.js");
224
232
  const candidates = runtimeState.issues.filter((i) => i.state === "Running" || i.state === "Queued");
225
233
  logger.debug({ count: candidates.length }, "[Queue] Checking for orphaned agent processes");
226
234
  for (const issue of candidates) {
@@ -258,7 +266,7 @@ function cleanTerminalWorkspaces() {
258
266
  logger.info({ count: terminals.length }, "[Queue] Scheduling terminal workspace cleanup in background");
259
267
  const state = runtimeState;
260
268
  setImmediate(async () => {
261
- const { cleanWorkspace } = await import("./agent-AAT7OHAL.js");
269
+ const { cleanWorkspace } = await import("./agent-KDPOZCI5.js");
262
270
  for (const issue of terminals) {
263
271
  try {
264
272
  await cleanWorkspace(issue.id, issue, state);
@@ -292,4 +300,4 @@ export {
292
300
  cleanTerminalWorkspaces,
293
301
  getQueueStats
294
302
  };
295
- //# sourceMappingURL=chunk-AVSRIV47.js.map
303
+ //# sourceMappingURL=chunk-3QL4QAQ5.js.map
@@ -196,36 +196,11 @@ var PROMPT_TEMPLATES = {
196
196
  // src/agents/prompts/integrations-agency-agents.stub.md
197
197
  "integrations-impeccable": '# Impeccable integration idea\n\nUse impeccable-oriented skills as a frontend review layer around fifony issues.\n\nSuggested pattern:\n\n1. Use `agency-senior-developer` or `codex` as executor.\n2. Route UI-heavy issues to a reviewer prompt that explicitly asks for impeccable-style critique.\n3. Expose the resulting review through the fifony MCP prompts or as a follow-up review issue.\n\nSuggested labels:\n- frontend\n- ui\n- design-system\n\nSuggested reviewer prompt seed:\n"Review this implementation using impeccable standards for frontend quality, polish, hierarchy, spacing, responsiveness, and interaction clarity."\n',
198
198
  // src/agents/prompts/integrations-impeccable.stub.md
199
- "issue-enhancer-description": `You are helping improve issue metadata for a software execution queue.
200
- Rewrite the description to be clearer, complete, and directly actionable.
201
- Return strict JSON only with this schema:
202
- { "field": "description", "value": "..." }
203
-
204
- Issue type: {{issueType}}
205
- Current title: {{title}}
206
- Current description: {{description}}
207
- {{#if images}}
208
- Visual evidence (attached screenshots for context):
209
- {{#each images}}
210
- - {{this}}
211
- {{/each}}
212
- {{/if}}
213
-
214
- Rules:
215
- - Keep it concise but include meaningful acceptance criteria tailored to the issue type.
216
- - For "bug": focus on problem description, expected behavior, and steps to reproduce.
217
- - For "feature": focus on goal, acceptance criteria, and any relevant notes.
218
- - For "refactor": describe current state, desired state, and scope.
219
- - For "docs": describe what to document and target audience.
220
- - For "chore": describe the task and why it's needed now.
221
- - Use markdown formatting appropriate for the type (## headings, bullet points).
222
- - Avoid extra wrappers, outer quotes, or extra explanation.
223
- - The value should be in Portuguese if the input is in Portuguese; otherwise in English.
224
- `,
199
+ "issue-enhancer-description": 'You are helping improve issue metadata for a software execution queue.\nRewrite the description to be clearer, complete, and directly actionable.\n\nIssue type: {{issueType}}\nCurrent title: {{title}}\nCurrent description: {{description}}\n{{#if images}}\nVisual evidence (attached screenshots for context):\n{{#each images}}\n- {{this}}\n{{/each}}\n{{/if}}\n\nRules:\n- Keep it concise but include meaningful acceptance criteria tailored to the issue type.\n- For "bug": focus on problem description, expected behavior, and steps to reproduce.\n- For "feature": focus on goal, acceptance criteria, and any relevant notes.\n- For "refactor": describe current state, desired state, and scope.\n- For "docs": describe what to document and target audience.\n- For "chore": describe the task and why it\'s needed now.\n- Use markdown formatting appropriate for the type (## headings, bullet points).\n- The value should be in Portuguese if the input is in Portuguese; otherwise in English.\n\nAfter your analysis, return a single JSON code block as the LAST thing in your output:\n```json\n{ "field": "description", "value": "<REPLACE_WITH_ACTUAL_DESCRIPTION>" }\n```\n',
225
200
  // src/agents/prompts/issue-enhancer-description.stub.md
226
- "issue-enhancer-title": 'You are helping improve issue metadata for a software execution queue.\nRewrite the title for clarity, actionability, and specificity.\nReturn strict JSON only with this schema:\n{ "field": "title", "value": "..." }\n\nIssue type: {{issueType}}\nCurrent title: {{title}}\nDescription context: {{description}}\n{{#if images}}\nVisual evidence (attached screenshots for context):\n{{#each images}}\n- {{this}}\n{{/each}}\n{{/if}}\n\nRules:\n- Keep it concise and suitable as a task title.\n- Use imperative language when possible.\n- If the issue type is "bug", start with "fix: ". If "feature", start with "feat: ". If "refactor", start with "refactor: ". If "docs", start with "docs: ". If "chore", start with "chore: ". For "blank", use no prefix.\n- Do not include markdown, quotes, or extra explanation.\n- The value should be in Portuguese if the input is in Portuguese; otherwise in English.\n',
201
+ "issue-enhancer-title": 'You are helping improve issue metadata for a software execution queue.\nRewrite the title for clarity, actionability, and specificity.\n\nIssue type: {{issueType}}\nCurrent title: {{title}}\nDescription context: {{description}}\n{{#if images}}\nVisual evidence (attached screenshots for context):\n{{#each images}}\n- {{this}}\n{{/each}}\n{{/if}}\n\nRules:\n- Keep it concise and suitable as a task title.\n- Use imperative language when possible.\n- If the issue type is "bug", start with "fix: ". If "feature", start with "feat: ". If "refactor", start with "refactor: ". If "docs", start with "docs: ". If "chore", start with "chore: ". For "blank", use no prefix.\n- Do not include markdown, quotes, or extra explanation.\n- The value should be in Portuguese if the input is in Portuguese; otherwise in English.\n\nReturn a single JSON code block as the LAST thing in your output:\n```json\n{ "field": "title", "value": "<REPLACE_WITH_ACTUAL_TITLE>" }\n```\n',
227
202
  // src/agents/prompts/issue-enhancer-title.stub.md
228
- "issue-planner": 'You are a senior technical execution planner.\nProduce the best possible plan for the issue below, filling the JSON schema precisely.\n{{#if fast}}\n\nFAST MODE: Be brief and direct. Minimize reasoning depth.\n- 2-4 steps maximum. Skip optional fields (unknowns, risks, alternatives).\n- Focus only on: summary, steps, estimatedComplexity, suggestedPaths.\n{{/if}}\n\n{{#if availableCapabilities}}\n## Installed Capabilities (recommend from these lists)\n\n{{#if availableSkills.length}}\n### Skills\n{{#each availableSkills}}\n- **{{name}}**{{#if description}} \u2014 {{description}}{{/if}}{{#if whenToUse}} (Use when: {{whenToUse}}){{/if}}\n{{/each}}\n{{/if}}\n{{#if availableAgents.length}}\n### Agents\n{{#each availableAgents}}\n- **{{name}}**{{#if description}} \u2014 {{description}}{{/if}}{{#if whenToUse}} (Use when: {{whenToUse}}){{/if}}{{#if avoidIf}} (Avoid if: {{avoidIf}}){{/if}}\n{{/each}}\n{{/if}}\n{{#if availableCommands.length}}\n### Commands\n{{#each availableCommands}}\n- /{{name}}\n{{/each}}\n{{/if}}\n\nRecommend skills and agents ONLY from these lists. Do not invent names.\nOnly recommend when there is a concrete benefit \u2014 not everything needs skills or agents.\n{{/if}}\n\nIssue title: {{title}}\nIssue description: {{description}}\n{{#if images}}\nVisual evidence (attached screenshots for context):\n{{#each images}}\n- {{this}}\n{{/each}}\n{{/if}}\n{{#unless fast}}\n\nQuality rules:\n- Be concrete, not generic. No vague phrases like \'implement\' or \'improve\' without detail.\n- Break work into actionable steps (2-8 steps). Each step describes WHAT, not HOW.\n- Each step must have a clear \'doneWhen\' acceptance criterion.\n- Identify assumptions, constraints, unknowns, and risks.\n- For unknowns, specify what question needs answering and how to resolve it.\n- Suggest file paths that are likely relevant to the changes.\n\nComplexity estimation:\n- trivial: < 5 min, single-file cosmetic change\n- low: 5-15 min, small focused change\n- medium: 15-60 min, multi-file change with testing\n- high: > 1 hour, architectural change or new feature\n\nEffort suggestion:\n- low: simple fixes, no deep reasoning needed\n- medium: standard development work\n- high: complex architecture, security, or cross-cutting changes\n- Set per-role if different: planner, executor, reviewer\n{{/unless}}\n\nReturn strict JSON matching this schema. No text outside JSON. Use these exact field names.\nIMPORTANT: Replace ALL placeholder values with real content specific to the issue above. Do NOT copy the example values literally \u2014 every field must contain actual plan content derived from the issue.\n\n```json\n{\n "summary": "<YOUR one-line summary here>",\n "estimatedComplexity": "trivial|low|medium|high",\n "steps": [\n {\n "step": 1,\n "action": "<YOUR concrete action here>",\n "files": ["<real/path/to/file.ts>"],\n "details": "<YOUR additional context>",\n "doneWhen": "<YOUR acceptance criterion>"\n }\n ],\n "assumptions": ["<YOUR assumptions>"],\n "constraints": ["<YOUR constraints>"],\n "unknowns": [\n { "question": "<YOUR question>", "whyItMatters": "<YOUR reason>", "howToResolve": "<YOUR approach>" }\n ],\n "successCriteria": ["<YOUR criteria>"],\n "risks": [\n { "risk": "<YOUR risk>", "impact": "<YOUR impact>", "mitigation": "<YOUR mitigation>" }\n ],\n "suggestedPaths": ["<real/path/to/relevant/file.ts>"],\n "suggestedSkills": ["<skill-name-from-list-above>"],\n "suggestedAgents": ["<agent-name-from-list-above>"],\n "suggestedEffort": { "default": "medium", "planner": "low", "executor": "medium", "reviewer": "medium" }\n}\n```\n',
203
+ "issue-planner": 'You are a senior technical execution planner.\nProduce the best possible plan for the issue below, filling the JSON schema precisely.\n{{#if fast}}\n\nFAST MODE: Be brief and direct. Minimize reasoning depth.\n- 2-4 steps maximum. Skip optional fields (unknowns, risks, alternatives).\n- Focus only on: summary, steps, estimatedComplexity, suggestedPaths.\n{{/if}}\n\n{{#if availableCapabilities}}\n## Installed Capabilities (recommend from these lists)\n\n{{#if availableSkills.length}}\n### Skills\n{{#each availableSkills}}\n- **{{name}}**{{#if description}} \u2014 {{description}}{{/if}}{{#if whenToUse}} (Use when: {{whenToUse}}){{/if}}\n{{/each}}\n{{/if}}\n{{#if availableAgents.length}}\n### Agents\n{{#each availableAgents}}\n- **{{name}}**{{#if description}} \u2014 {{description}}{{/if}}{{#if whenToUse}} (Use when: {{whenToUse}}){{/if}}{{#if avoidIf}} (Avoid if: {{avoidIf}}){{/if}}\n{{/each}}\n{{/if}}\n{{#if availableCommands.length}}\n### Commands\n{{#each availableCommands}}\n- /{{name}}\n{{/each}}\n{{/if}}\n\nRecommend skills and agents ONLY from these lists. Do not invent names.\nOnly recommend when there is a concrete benefit \u2014 not everything needs skills or agents.\n{{/if}}\n\nIssue title: {{title}}\nIssue description: {{description}}\n{{#if images}}\nVisual evidence (attached screenshots for context):\n{{#each images}}\n- {{this}}\n{{/each}}\n{{/if}}\n{{#unless fast}}\n\nQuality rules:\n- Be concrete, not generic. No vague phrases like \'implement\' or \'improve\' without detail.\n- Break work into actionable steps (2-8 steps). Each step describes WHAT, not HOW.\n- Each step must have a clear \'doneWhen\' acceptance criterion.\n- Identify assumptions, constraints, unknowns, and risks.\n- For unknowns, specify what question needs answering and how to resolve it.\n- Suggest file paths that are likely relevant to the changes.\n\nComplexity estimation:\n- trivial: < 5 min, single-file cosmetic change\n- low: 5-15 min, small focused change\n- medium: 15-60 min, multi-file change with testing\n- high: > 1 hour, architectural change or new feature\n\nEffort suggestion:\n- low: simple fixes, no deep reasoning needed\n- medium: standard development work\n- high: complex architecture, security, or cross-cutting changes\n- Set per-role if different: planner, executor, reviewer\n{{/unless}}\n\n## Instructions\n\nYou are encouraged to explore the codebase \u2014 read files, search for patterns, inspect structure \u2014 to produce an informed plan. Use any tools available to you.\n\nAfter your analysis, you MUST output the final plan as a single JSON code block (```json ... ```).\nThe JSON block must be the LAST thing in your output. Any analysis or reasoning should come BEFORE it.\n\nIMPORTANT: Replace ALL placeholder values with real content specific to the issue above. Do NOT copy the example values literally \u2014 every field must contain actual plan content derived from the issue.\n\nUse these exact field names:\n\n```json\n{\n "summary": "<YOUR one-line summary here>",\n "estimatedComplexity": "trivial|low|medium|high",\n "steps": [\n {\n "step": 1,\n "action": "<YOUR concrete action here>",\n "files": ["<real/path/to/file.ts>"],\n "details": "<YOUR additional context>",\n "doneWhen": "<YOUR acceptance criterion>"\n }\n ],\n "assumptions": ["<YOUR assumptions>"],\n "constraints": ["<YOUR constraints>"],\n "unknowns": [\n { "question": "<YOUR question>", "whyItMatters": "<YOUR reason>", "howToResolve": "<YOUR approach>" }\n ],\n "successCriteria": ["<YOUR criteria>"],\n "risks": [\n { "risk": "<YOUR risk>", "impact": "<YOUR impact>", "mitigation": "<YOUR mitigation>" }\n ],\n "suggestedPaths": ["<real/path/to/relevant/file.ts>"],\n "suggestedSkills": ["<skill-name-from-list-above>"],\n "suggestedAgents": ["<agent-name-from-list-above>"],\n "suggestedEffort": { "default": "medium", "planner": "low", "executor": "medium", "reviewer": "medium" }\n}\n```\n',
229
204
  // src/agents/prompts/issue-planner.stub.md
230
205
  "issue-planner-refine": "You are a senior technical execution planner refining an existing plan based on user feedback.\n\n## Original Issue\nTitle: {{title}}\nDescription: {{description}}\n\n## Current Plan (JSON)\n```json\n{{currentPlan}}\n```\n\n## User Feedback\n{{feedback}}\n\n## Instructions\n\nRevise the plan above to address the user's feedback precisely.\n\nRules:\n- Keep all parts of the plan that are NOT affected by the feedback unchanged.\n- Only modify, add, or remove elements that the feedback specifically requests.\n- Preserve the same JSON schema structure as the current plan.\n- Maintain step numbering consistency after changes.\n- If feedback asks to add steps, insert them in the logical position and renumber.\n- If feedback asks to remove steps, renumber remaining steps sequentially.\n- Update the summary if the overall direction changed.\n- Re-evaluate estimatedComplexity if the scope changed significantly.\n- Update suggestedPaths, suggestedSkills, and suggestedAgents if affected by the changes.\n\nReturn strict JSON. No text outside JSON.\n",
231
206
  // src/agents/prompts/issue-planner-refine.stub.md
@@ -237,6 +212,8 @@ Rules:
237
212
  // src/agents/prompts/mcp-issue.stub.md
238
213
  "mcp-review-workflow": "Review the pipeline configuration for this fifony workspace as {{provider}}.\n\nWorkspace: {{workspaceRoot}}\n\nFocus on:\n- provider orchestration quality (plan/execute/review stages)\n- hooks safety (beforeRun, afterRun, afterCreate, beforeRemove)\n- prompt clarity\n- issue lifecycle correctness\n- what an MCP client needs in order to integrate cleanly\n",
239
214
  // src/agents/prompts/mcp-review-workflow.stub.md
215
+ "merge-conflict-resolver": "You are resolving git merge conflicts in a software project.\n\n## Context\n\nIssue: {{issueIdentifier}} \u2014 {{title}}\n{{#if description}}\nDescription: {{description}}\n{{/if}}\nMerging branch `{{featureBranch}}` into `{{baseBranch}}`.\n\n## Conflicting Files\n\nThe following files have conflict markers (`<<<<<<<`, `=======`, `>>>>>>>`) that you must resolve:\n\n{{#each conflictFiles}}\n- {{this}}\n{{/each}}\n\n## Instructions\n\n1. Read each conflicting file and understand the intent of BOTH sides.\n2. Resolve the conflict markers by choosing the correct combination of changes. Prefer keeping both sides' intent when possible.\n3. After resolving, stage each file with `git add <file>`.\n4. Do NOT commit \u2014 the merge commit will be created automatically after you finish.\n5. Do NOT modify files that are not in the conflict list.\n6. Verify there are no remaining conflict markers (`<<<<<<<`) in any resolved file.\n",
216
+ // src/agents/prompts/merge-conflict-resolver.stub.md
240
217
  "project-analysis": `You are analyzing a software project to help configure an AI-powered development assistant.
241
218
 
242
219
  Look at the project structure, source code, configuration files, and any documentation you can find. Pay special attention to:
@@ -308,4 +285,4 @@ export {
308
285
  repairTruncatedJson,
309
286
  renderPrompt
310
287
  };
311
- //# sourceMappingURL=chunk-T2YJOZ6N.js.map
288
+ //# sourceMappingURL=chunk-EPY5TTQK.js.map