claude-kanban 0.6.2 → 0.6.3

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 {
@@ -1628,19 +1670,24 @@ var RoadmapService = class extends EventEmitter2 {
1628
1670
  * Build the competitor research prompt
1629
1671
  */
1630
1672
  buildCompetitorResearchPrompt(projectInfo) {
1631
- return `You are a product research analyst. Research competitors for the following project:
1673
+ return `You are a product research analyst. Your task is to research competitors and return ONLY JSON output.
1632
1674
 
1633
- Project: ${projectInfo.name}
1634
- Description: ${projectInfo.description}
1635
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1675
+ IMPORTANT: Do not ask any questions. Do not request clarification. Just analyze and return the JSON.
1636
1676
 
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
1677
+ ## Project Information
1678
+ - Name: ${projectInfo.name}
1679
+ - Description: ${projectInfo.description}
1680
+ - Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1681
+
1682
+ ## Your Task
1683
+ 1. Based on the project description, identify what type of product/service this is
1684
+ 2. Find 3-5 competitors or similar projects in this space
1685
+ 3. Analyze their strengths and weaknesses
1686
+ 4. Identify differentiating features
1687
+
1688
+ ## Required Output Format
1689
+ Return ONLY a JSON array (no markdown code blocks, no explanations):
1641
1690
 
1642
- Return your findings as JSON in this format:
1643
- \`\`\`json
1644
1691
  [
1645
1692
  {
1646
1693
  "name": "Competitor Name",
@@ -1650,9 +1697,8 @@ Return your findings as JSON in this format:
1650
1697
  "differentiators": ["feature 1", "feature 2"]
1651
1698
  }
1652
1699
  ]
1653
- \`\`\`
1654
1700
 
1655
- Only return the JSON, no other text.`;
1701
+ Begin your response with [ and end with ]. No other text.`;
1656
1702
  }
1657
1703
  /**
1658
1704
  * Build the roadmap generation prompt
@@ -1692,7 +1738,9 @@ ${request.customPrompt}
1692
1738
  `;
1693
1739
  }
1694
1740
  prompt += `
1695
- ## Your Task
1741
+ ## Instructions
1742
+ IMPORTANT: Do not ask any questions. Do not request clarification. Generate the roadmap based on the information provided.
1743
+
1696
1744
  Create a comprehensive product roadmap with features organized into phases.
1697
1745
 
1698
1746
  Use the MoSCoW prioritization framework:
@@ -1707,8 +1755,9 @@ For each feature, estimate:
1707
1755
 
1708
1756
  Categories should be one of: functional, ui, bug, enhancement, testing, refactor
1709
1757
 
1710
- Return your roadmap as JSON:
1711
- \`\`\`json
1758
+ ## Required Output Format
1759
+ Return ONLY valid JSON (no markdown code blocks, no explanations). Begin with { and end with }:
1760
+
1712
1761
  {
1713
1762
  "projectDescription": "Brief description of the project",
1714
1763
  "targetAudience": "Who this project is for",
@@ -1736,11 +1785,10 @@ Return your roadmap as JSON:
1736
1785
  }
1737
1786
  ]
1738
1787
  }
1739
- \`\`\`
1740
1788
 
1741
1789
  Generate 10-20 strategic features across 3-4 phases. Be specific and actionable.
1742
1790
  Don't duplicate features that already exist in the project.
1743
- Only return the JSON, no other text.`;
1791
+ Begin your response with { - no other text before or after the JSON.`;
1744
1792
  return prompt;
1745
1793
  }
1746
1794
  /**