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.
- package/dist/bin/cli.js +152 -70
- package/dist/bin/cli.js.map +1 -1
- package/dist/server/index.js +152 -70
- 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 {
|
|
@@ -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
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
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
|
-
|
|
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
|
|
1662
|
-
|
|
1663
|
-
##
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
${projectInfo.
|
|
1668
|
-
|
|
1669
|
-
|
|
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
|
|
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
|
-
-
|
|
1679
|
-
`).join("
|
|
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
|
-
|
|
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
|
-
##
|
|
1696
|
-
|
|
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": "
|
|
1714
|
-
"targetAudience": "
|
|
1786
|
+
"projectDescription": "Inferred project purpose and value proposition",
|
|
1787
|
+
"targetAudience": "Primary user persona",
|
|
1715
1788
|
"phases": [
|
|
1716
1789
|
{
|
|
1717
|
-
"name": "
|
|
1718
|
-
"description": "Core features for
|
|
1790
|
+
"name": "Foundation",
|
|
1791
|
+
"description": "Core features required for initial launch"
|
|
1719
1792
|
},
|
|
1720
1793
|
{
|
|
1721
|
-
"name": "
|
|
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": "
|
|
1734
|
-
"rationale": "Why this feature
|
|
1735
|
-
"steps": ["
|
|
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
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
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
|
/**
|