claude-kanban 0.6.2 → 0.6.4

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.
@@ -1513,11 +1513,33 @@ var RoadmapService = class extends EventEmitter2 {
1513
1513
  let description = "";
1514
1514
  let stack = [];
1515
1515
  let existingFeatures = [];
1516
+ const claudeMdPaths = ["CLAUDE.md", "claude.md", ".claude/CLAUDE.md"];
1517
+ for (const claudePath of claudeMdPaths) {
1518
+ const fullPath = join5(this.projectPath, claudePath);
1519
+ if (existsSync3(fullPath)) {
1520
+ const claudeMd = readFileSync5(fullPath, "utf-8");
1521
+ const lines = claudeMd.split("\n");
1522
+ const contentLines = [];
1523
+ for (const line of lines) {
1524
+ const trimmed = line.trim();
1525
+ if (trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("```")) {
1526
+ contentLines.push(trimmed);
1527
+ if (contentLines.join(" ").length > 300) break;
1528
+ }
1529
+ }
1530
+ if (contentLines.length > 0) {
1531
+ description = contentLines.join(" ").slice(0, 500);
1532
+ }
1533
+ break;
1534
+ }
1535
+ }
1516
1536
  const packageJsonPath = join5(this.projectPath, "package.json");
1517
1537
  if (existsSync3(packageJsonPath)) {
1518
1538
  try {
1519
1539
  const pkg = JSON.parse(readFileSync5(packageJsonPath, "utf-8"));
1520
- description = pkg.description || "";
1540
+ if (!description && pkg.description && !pkg.description.includes("<")) {
1541
+ description = pkg.description;
1542
+ }
1521
1543
  const deps = { ...pkg.dependencies, ...pkg.devDependencies };
1522
1544
  if (deps.react) stack.push("React");
1523
1545
  if (deps.vue) stack.push("Vue");
@@ -1527,23 +1549,43 @@ var RoadmapService = class extends EventEmitter2 {
1527
1549
  if (deps.fastify) stack.push("Fastify");
1528
1550
  if (deps.typescript) stack.push("TypeScript");
1529
1551
  if (deps.tailwindcss) stack.push("Tailwind CSS");
1552
+ if (deps.laravel) stack.push("Laravel");
1530
1553
  } catch {
1531
1554
  }
1532
1555
  }
1533
- const readmePaths = ["README.md", "readme.md", "README.txt", "readme.txt"];
1534
- for (const readmePath of readmePaths) {
1535
- const fullPath = join5(this.projectPath, readmePath);
1536
- if (existsSync3(fullPath)) {
1537
- const readme = readFileSync5(fullPath, "utf-8");
1538
- if (!description) {
1539
- const lines = readme.split("\n").filter((l) => l.trim() && !l.startsWith("#"));
1556
+ const composerPath = join5(this.projectPath, "composer.json");
1557
+ if (existsSync3(composerPath)) {
1558
+ try {
1559
+ const composer = JSON.parse(readFileSync5(composerPath, "utf-8"));
1560
+ if (!description && composer.description && !composer.description.includes("<")) {
1561
+ description = composer.description;
1562
+ }
1563
+ if (composer.require?.["laravel/framework"]) stack.push("Laravel");
1564
+ if (composer.require?.["livewire/livewire"]) stack.push("Livewire");
1565
+ if (composer.require?.["inertiajs/inertia-laravel"]) stack.push("Inertia.js");
1566
+ } catch {
1567
+ }
1568
+ }
1569
+ if (!description) {
1570
+ const readmePaths = ["README.md", "readme.md", "README.txt", "readme.txt"];
1571
+ for (const readmePath of readmePaths) {
1572
+ const fullPath = join5(this.projectPath, readmePath);
1573
+ if (existsSync3(fullPath)) {
1574
+ const readme = readFileSync5(fullPath, "utf-8");
1575
+ const lines = readme.split("\n").filter((l) => {
1576
+ const trimmed = l.trim();
1577
+ return trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("<") && !trimmed.startsWith("![") && !trimmed.startsWith("[!");
1578
+ });
1540
1579
  if (lines.length > 0) {
1541
1580
  description = lines[0].trim().slice(0, 500);
1542
1581
  }
1582
+ break;
1543
1583
  }
1544
- break;
1545
1584
  }
1546
1585
  }
1586
+ if (!description) {
1587
+ description = `A ${stack.length > 0 ? stack.join("/") + " " : ""}software project`;
1588
+ }
1547
1589
  const prdPath = join5(this.projectPath, ROADMAP_DIR, "prd.json");
1548
1590
  if (existsSync3(prdPath)) {
1549
1591
  try {
@@ -1612,6 +1654,7 @@ var RoadmapService = class extends EventEmitter2 {
1612
1654
  phase: f.phase,
1613
1655
  rationale: f.rationale || "",
1614
1656
  steps: f.steps,
1657
+ acceptanceCriteria: f.acceptanceCriteria,
1615
1658
  addedToKanban: false
1616
1659
  })),
1617
1660
  competitors,
@@ -1625,64 +1668,83 @@ var RoadmapService = class extends EventEmitter2 {
1625
1668
  }
1626
1669
  }
1627
1670
  /**
1628
- * Build the competitor research prompt
1671
+ * Build the competitor research prompt (inspired by Auto-Claude)
1629
1672
  */
1630
1673
  buildCompetitorResearchPrompt(projectInfo) {
1631
- return `You are a product research analyst. Research competitors for the following project:
1632
-
1633
- Project: ${projectInfo.name}
1634
- Description: ${projectInfo.description}
1635
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1674
+ return `You are a Competitor Analysis Agent. This is a NON-INTERACTIVE autonomous task - you CANNOT ask questions or request clarification. Make educated inferences from available information.
1675
+
1676
+ ## Your Role
1677
+ Research competitors, analyze user feedback, and document pain points to inform feature prioritization.
1678
+
1679
+ ## Project Context
1680
+ - Name: ${projectInfo.name}
1681
+ - Description: ${projectInfo.description}
1682
+ - Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1683
+
1684
+ ## Research Process
1685
+ 1. DISCOVERY: Identify 3-5 main competitors (direct competitors, market leaders, alternative solutions)
1686
+ 2. FEEDBACK COLLECTION: Gather real user complaints from:
1687
+ - App store reviews
1688
+ - Reddit discussions
1689
+ - GitHub issues
1690
+ - Stack Overflow questions
1691
+ - Twitter/social media
1692
+ 3. PAIN POINT ANALYSIS: Extract patterns - missing features, UX problems, performance issues, pricing concerns
1693
+
1694
+ ## Critical Requirements
1695
+ - Document sources for every pain point (no fabricated data)
1696
+ - Focus on authentic user feedback, not just feature lists
1697
+ - Include severity ratings where possible
1698
+ - Identify market gaps and opportunities
1699
+
1700
+ ## Required Output
1701
+ Return ONLY valid JSON (no markdown, no explanations). Begin with [ and end with ]:
1636
1702
 
1637
- Your task:
1638
- 1. Use web search to find 3-5 competitors or similar projects
1639
- 2. Analyze their strengths and weaknesses
1640
- 3. Identify differentiating features
1641
-
1642
- Return your findings as JSON in this format:
1643
- \`\`\`json
1644
1703
  [
1645
1704
  {
1646
1705
  "name": "Competitor Name",
1647
1706
  "url": "https://example.com",
1648
1707
  "strengths": ["strength 1", "strength 2"],
1649
- "weaknesses": ["weakness 1", "weakness 2"],
1650
- "differentiators": ["feature 1", "feature 2"]
1708
+ "weaknesses": ["weakness 1 - based on user feedback from [source]", "weakness 2"],
1709
+ "differentiators": ["unique feature 1", "unique feature 2"],
1710
+ "painPoints": ["user complaint 1", "user complaint 2"],
1711
+ "marketGaps": ["opportunity 1"]
1651
1712
  }
1652
1713
  ]
1653
- \`\`\`
1654
1714
 
1655
- Only return the JSON, no other text.`;
1715
+ Begin your response with [ - no other text.`;
1656
1716
  }
1657
1717
  /**
1658
- * Build the roadmap generation prompt
1718
+ * Build the roadmap generation prompt (inspired by Auto-Claude)
1659
1719
  */
1660
1720
  buildRoadmapPrompt(projectInfo, competitors, request) {
1661
- let prompt = `You are a product strategist creating a feature roadmap for a software project.
1662
-
1663
- ## Project Information
1664
- Name: ${projectInfo.name}
1665
- Description: ${projectInfo.description}
1666
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1667
- ${projectInfo.existingFeatures.length > 0 ? `
1668
- Existing Features/Tasks:
1669
- ${projectInfo.existingFeatures.map((f) => `- ${f}`).join("\n")}` : ""}
1721
+ let prompt = `You are a Roadmap Feature Generator Agent. This is a NON-INTERACTIVE autonomous task - you CANNOT ask questions or request clarification. Make educated inferences from available information.
1722
+
1723
+ ## Your Role
1724
+ Convert project context into a strategic, prioritized feature roadmap with phased organization.
1725
+
1726
+ ## Project Context
1727
+ - Name: ${projectInfo.name}
1728
+ - Description: ${projectInfo.description}
1729
+ - Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1730
+ ${projectInfo.existingFeatures.length > 0 ? `- Existing Features: ${projectInfo.existingFeatures.join(", ")}` : ""}
1670
1731
  `;
1671
1732
  if (competitors && competitors.length > 0) {
1672
1733
  prompt += `
1673
- ## Competitor Analysis
1734
+ ## Competitor Intelligence
1735
+ Use this data to identify opportunities and prioritize features that address market gaps.
1674
1736
  ${competitors.map((c) => `
1675
- ### ${c.name}
1737
+ ### ${c.name}${c.url ? ` (${c.url})` : ""}
1676
1738
  - Strengths: ${c.strengths.join(", ")}
1677
1739
  - Weaknesses: ${c.weaknesses.join(", ")}
1678
- - Key Features: ${c.differentiators.join(", ")}
1679
- `).join("\n")}
1740
+ - Differentiators: ${c.differentiators.join(", ")}
1741
+ `).join("")}
1680
1742
  `;
1681
1743
  }
1682
1744
  if (request.focusAreas && request.focusAreas.length > 0) {
1683
1745
  prompt += `
1684
1746
  ## Focus Areas
1685
- The user wants to focus on: ${request.focusAreas.join(", ")}
1747
+ Prioritize features related to: ${request.focusAreas.join(", ")}
1686
1748
  `;
1687
1749
  }
1688
1750
  if (request.customPrompt) {
@@ -1692,55 +1754,75 @@ ${request.customPrompt}
1692
1754
  `;
1693
1755
  }
1694
1756
  prompt += `
1695
- ## Your Task
1696
- Create a comprehensive product roadmap with features organized into phases.
1757
+ ## Workflow
1758
+ 1. Analyze project goals and user needs
1759
+ 2. Apply MoSCoW prioritization (must/should/could/wont)
1760
+ 3. Assess complexity and impact for each feature
1761
+ 4. Organize into logical phases with dependencies
1762
+ 5. Generate structured roadmap output
1763
+
1764
+ ## Standard Phases
1765
+ - Foundation: Core infrastructure and essential features
1766
+ - Enhancement: Improved UX and additional functionality
1767
+ - Scale: Performance, integrations, advanced features
1768
+ - Future: Long-term vision and nice-to-haves
1769
+
1770
+ ## MoSCoW Framework
1771
+ - must: Critical for launch, blocks everything else
1772
+ - should: Important but not blocking
1773
+ - could: Nice to have, implement if time permits
1774
+ - wont: Out of scope for current planning horizon
1775
+
1776
+ ## Priority Matrix
1777
+ - High Impact + Low Effort = Do First (must)
1778
+ - High Impact + High Effort = Plan Carefully (should)
1779
+ - Low Impact + Low Effort = Quick Wins (could)
1780
+ - Low Impact + High Effort = Deprioritize (wont)
1781
+
1782
+ ## Required Output Schema
1783
+ Return ONLY valid JSON. Begin with { and end with }:
1697
1784
 
1698
- Use the MoSCoW prioritization framework:
1699
- - must: Critical features that must be implemented
1700
- - should: Important features that should be implemented
1701
- - could: Nice-to-have features that could be implemented
1702
- - wont: Features that won't be implemented in the near term
1703
-
1704
- For each feature, estimate:
1705
- - effort: low, medium, or high
1706
- - impact: low, medium, or high
1707
-
1708
- Categories should be one of: functional, ui, bug, enhancement, testing, refactor
1709
-
1710
- Return your roadmap as JSON:
1711
- \`\`\`json
1712
1785
  {
1713
- "projectDescription": "Brief description of the project",
1714
- "targetAudience": "Who this project is for",
1786
+ "projectDescription": "Inferred project purpose and value proposition",
1787
+ "targetAudience": "Primary user persona",
1715
1788
  "phases": [
1716
1789
  {
1717
- "name": "Phase 1: MVP",
1718
- "description": "Core features for minimum viable product"
1790
+ "name": "Foundation",
1791
+ "description": "Core features required for initial launch"
1719
1792
  },
1720
1793
  {
1721
- "name": "Phase 2: Enhancement",
1794
+ "name": "Enhancement",
1722
1795
  "description": "Features to improve user experience"
1796
+ },
1797
+ {
1798
+ "name": "Scale",
1799
+ "description": "Growth and advanced capabilities"
1723
1800
  }
1724
1801
  ],
1725
1802
  "features": [
1726
1803
  {
1727
1804
  "title": "Feature title",
1728
- "description": "What this feature does",
1805
+ "description": "What this feature does and why users need it",
1729
1806
  "priority": "must",
1730
1807
  "category": "functional",
1731
1808
  "effort": "medium",
1732
1809
  "impact": "high",
1733
- "phase": "Phase 1: MVP",
1734
- "rationale": "Why this feature is important",
1735
- "steps": ["Step 1", "Step 2"]
1810
+ "phase": "Foundation",
1811
+ "rationale": "Why this feature matters - reference competitor gaps if applicable",
1812
+ "steps": ["Implementation step 1", "Implementation step 2"],
1813
+ "acceptanceCriteria": ["User can do X", "System handles Y"]
1736
1814
  }
1737
1815
  ]
1738
1816
  }
1739
- \`\`\`
1740
1817
 
1741
- Generate 10-20 strategic features across 3-4 phases. Be specific and actionable.
1742
- Don't duplicate features that already exist in the project.
1743
- Only return the JSON, no other text.`;
1818
+ ## Critical Requirements
1819
+ - Generate 10-20 features across 3-4 phases
1820
+ - Each feature must have clear acceptance criteria
1821
+ - Don't duplicate existing project features
1822
+ - Reference competitor insights in rationale where relevant
1823
+ - Be specific and actionable, not generic
1824
+
1825
+ Begin your response with { - no other text.`;
1744
1826
  return prompt;
1745
1827
  }
1746
1828
  /**