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.
- package/dist/bin/cli.js +74 -26
- package/dist/bin/cli.js.map +1 -1
- package/dist/server/index.js +74 -26
- package/dist/server/index.js.map +1 -1
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -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
|
|
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
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
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.
|
|
1673
|
+
return `You are a product research analyst. Your task is to research competitors and return ONLY JSON output.
|
|
1632
1674
|
|
|
1633
|
-
|
|
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
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
1711
|
-
|
|
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
|
-
|
|
1791
|
+
Begin your response with { - no other text before or after the JSON.`;
|
|
1744
1792
|
return prompt;
|
|
1745
1793
|
}
|
|
1746
1794
|
/**
|