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/bin/cli.js
CHANGED
|
@@ -1841,11 +1841,33 @@ var RoadmapService = class extends EventEmitter2 {
|
|
|
1841
1841
|
let description = "";
|
|
1842
1842
|
let stack = [];
|
|
1843
1843
|
let existingFeatures = [];
|
|
1844
|
+
const claudeMdPaths = ["CLAUDE.md", "claude.md", ".claude/CLAUDE.md"];
|
|
1845
|
+
for (const claudePath of claudeMdPaths) {
|
|
1846
|
+
const fullPath = join5(this.projectPath, claudePath);
|
|
1847
|
+
if (existsSync3(fullPath)) {
|
|
1848
|
+
const claudeMd = readFileSync5(fullPath, "utf-8");
|
|
1849
|
+
const lines = claudeMd.split("\n");
|
|
1850
|
+
const contentLines = [];
|
|
1851
|
+
for (const line of lines) {
|
|
1852
|
+
const trimmed = line.trim();
|
|
1853
|
+
if (trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("```")) {
|
|
1854
|
+
contentLines.push(trimmed);
|
|
1855
|
+
if (contentLines.join(" ").length > 300) break;
|
|
1856
|
+
}
|
|
1857
|
+
}
|
|
1858
|
+
if (contentLines.length > 0) {
|
|
1859
|
+
description = contentLines.join(" ").slice(0, 500);
|
|
1860
|
+
}
|
|
1861
|
+
break;
|
|
1862
|
+
}
|
|
1863
|
+
}
|
|
1844
1864
|
const packageJsonPath = join5(this.projectPath, "package.json");
|
|
1845
1865
|
if (existsSync3(packageJsonPath)) {
|
|
1846
1866
|
try {
|
|
1847
1867
|
const pkg = JSON.parse(readFileSync5(packageJsonPath, "utf-8"));
|
|
1848
|
-
description
|
|
1868
|
+
if (!description && pkg.description && !pkg.description.includes("<")) {
|
|
1869
|
+
description = pkg.description;
|
|
1870
|
+
}
|
|
1849
1871
|
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
1850
1872
|
if (deps.react) stack.push("React");
|
|
1851
1873
|
if (deps.vue) stack.push("Vue");
|
|
@@ -1855,23 +1877,43 @@ var RoadmapService = class extends EventEmitter2 {
|
|
|
1855
1877
|
if (deps.fastify) stack.push("Fastify");
|
|
1856
1878
|
if (deps.typescript) stack.push("TypeScript");
|
|
1857
1879
|
if (deps.tailwindcss) stack.push("Tailwind CSS");
|
|
1880
|
+
if (deps.laravel) stack.push("Laravel");
|
|
1858
1881
|
} catch {
|
|
1859
1882
|
}
|
|
1860
1883
|
}
|
|
1861
|
-
const
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1884
|
+
const composerPath = join5(this.projectPath, "composer.json");
|
|
1885
|
+
if (existsSync3(composerPath)) {
|
|
1886
|
+
try {
|
|
1887
|
+
const composer = JSON.parse(readFileSync5(composerPath, "utf-8"));
|
|
1888
|
+
if (!description && composer.description && !composer.description.includes("<")) {
|
|
1889
|
+
description = composer.description;
|
|
1890
|
+
}
|
|
1891
|
+
if (composer.require?.["laravel/framework"]) stack.push("Laravel");
|
|
1892
|
+
if (composer.require?.["livewire/livewire"]) stack.push("Livewire");
|
|
1893
|
+
if (composer.require?.["inertiajs/inertia-laravel"]) stack.push("Inertia.js");
|
|
1894
|
+
} catch {
|
|
1895
|
+
}
|
|
1896
|
+
}
|
|
1897
|
+
if (!description) {
|
|
1898
|
+
const readmePaths = ["README.md", "readme.md", "README.txt", "readme.txt"];
|
|
1899
|
+
for (const readmePath of readmePaths) {
|
|
1900
|
+
const fullPath = join5(this.projectPath, readmePath);
|
|
1901
|
+
if (existsSync3(fullPath)) {
|
|
1902
|
+
const readme = readFileSync5(fullPath, "utf-8");
|
|
1903
|
+
const lines = readme.split("\n").filter((l) => {
|
|
1904
|
+
const trimmed = l.trim();
|
|
1905
|
+
return trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("<") && !trimmed.startsWith("![") && !trimmed.startsWith("[!");
|
|
1906
|
+
});
|
|
1868
1907
|
if (lines.length > 0) {
|
|
1869
1908
|
description = lines[0].trim().slice(0, 500);
|
|
1870
1909
|
}
|
|
1910
|
+
break;
|
|
1871
1911
|
}
|
|
1872
|
-
break;
|
|
1873
1912
|
}
|
|
1874
1913
|
}
|
|
1914
|
+
if (!description) {
|
|
1915
|
+
description = `A ${stack.length > 0 ? stack.join("/") + " " : ""}software project`;
|
|
1916
|
+
}
|
|
1875
1917
|
const prdPath = join5(this.projectPath, ROADMAP_DIR, "prd.json");
|
|
1876
1918
|
if (existsSync3(prdPath)) {
|
|
1877
1919
|
try {
|
|
@@ -1940,6 +1982,7 @@ var RoadmapService = class extends EventEmitter2 {
|
|
|
1940
1982
|
phase: f.phase,
|
|
1941
1983
|
rationale: f.rationale || "",
|
|
1942
1984
|
steps: f.steps,
|
|
1985
|
+
acceptanceCriteria: f.acceptanceCriteria,
|
|
1943
1986
|
addedToKanban: false
|
|
1944
1987
|
})),
|
|
1945
1988
|
competitors,
|
|
@@ -1953,64 +1996,83 @@ var RoadmapService = class extends EventEmitter2 {
|
|
|
1953
1996
|
}
|
|
1954
1997
|
}
|
|
1955
1998
|
/**
|
|
1956
|
-
* Build the competitor research prompt
|
|
1999
|
+
* Build the competitor research prompt (inspired by Auto-Claude)
|
|
1957
2000
|
*/
|
|
1958
2001
|
buildCompetitorResearchPrompt(projectInfo) {
|
|
1959
|
-
return `You are a
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
2002
|
+
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.
|
|
2003
|
+
|
|
2004
|
+
## Your Role
|
|
2005
|
+
Research competitors, analyze user feedback, and document pain points to inform feature prioritization.
|
|
2006
|
+
|
|
2007
|
+
## Project Context
|
|
2008
|
+
- Name: ${projectInfo.name}
|
|
2009
|
+
- Description: ${projectInfo.description}
|
|
2010
|
+
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
|
|
2011
|
+
|
|
2012
|
+
## Research Process
|
|
2013
|
+
1. DISCOVERY: Identify 3-5 main competitors (direct competitors, market leaders, alternative solutions)
|
|
2014
|
+
2. FEEDBACK COLLECTION: Gather real user complaints from:
|
|
2015
|
+
- App store reviews
|
|
2016
|
+
- Reddit discussions
|
|
2017
|
+
- GitHub issues
|
|
2018
|
+
- Stack Overflow questions
|
|
2019
|
+
- Twitter/social media
|
|
2020
|
+
3. PAIN POINT ANALYSIS: Extract patterns - missing features, UX problems, performance issues, pricing concerns
|
|
2021
|
+
|
|
2022
|
+
## Critical Requirements
|
|
2023
|
+
- Document sources for every pain point (no fabricated data)
|
|
2024
|
+
- Focus on authentic user feedback, not just feature lists
|
|
2025
|
+
- Include severity ratings where possible
|
|
2026
|
+
- Identify market gaps and opportunities
|
|
2027
|
+
|
|
2028
|
+
## Required Output
|
|
2029
|
+
Return ONLY valid JSON (no markdown, no explanations). Begin with [ and end with ]:
|
|
1964
2030
|
|
|
1965
|
-
Your task:
|
|
1966
|
-
1. Use web search to find 3-5 competitors or similar projects
|
|
1967
|
-
2. Analyze their strengths and weaknesses
|
|
1968
|
-
3. Identify differentiating features
|
|
1969
|
-
|
|
1970
|
-
Return your findings as JSON in this format:
|
|
1971
|
-
\`\`\`json
|
|
1972
2031
|
[
|
|
1973
2032
|
{
|
|
1974
2033
|
"name": "Competitor Name",
|
|
1975
2034
|
"url": "https://example.com",
|
|
1976
2035
|
"strengths": ["strength 1", "strength 2"],
|
|
1977
|
-
"weaknesses": ["weakness 1", "weakness 2"],
|
|
1978
|
-
"differentiators": ["feature 1", "feature 2"]
|
|
2036
|
+
"weaknesses": ["weakness 1 - based on user feedback from [source]", "weakness 2"],
|
|
2037
|
+
"differentiators": ["unique feature 1", "unique feature 2"],
|
|
2038
|
+
"painPoints": ["user complaint 1", "user complaint 2"],
|
|
2039
|
+
"marketGaps": ["opportunity 1"]
|
|
1979
2040
|
}
|
|
1980
2041
|
]
|
|
1981
|
-
\`\`\`
|
|
1982
2042
|
|
|
1983
|
-
|
|
2043
|
+
Begin your response with [ - no other text.`;
|
|
1984
2044
|
}
|
|
1985
2045
|
/**
|
|
1986
|
-
* Build the roadmap generation prompt
|
|
2046
|
+
* Build the roadmap generation prompt (inspired by Auto-Claude)
|
|
1987
2047
|
*/
|
|
1988
2048
|
buildRoadmapPrompt(projectInfo, competitors, request) {
|
|
1989
|
-
let prompt = `You are a
|
|
1990
|
-
|
|
1991
|
-
##
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
${projectInfo.
|
|
1996
|
-
|
|
1997
|
-
|
|
2049
|
+
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.
|
|
2050
|
+
|
|
2051
|
+
## Your Role
|
|
2052
|
+
Convert project context into a strategic, prioritized feature roadmap with phased organization.
|
|
2053
|
+
|
|
2054
|
+
## Project Context
|
|
2055
|
+
- Name: ${projectInfo.name}
|
|
2056
|
+
- Description: ${projectInfo.description}
|
|
2057
|
+
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
|
|
2058
|
+
${projectInfo.existingFeatures.length > 0 ? `- Existing Features: ${projectInfo.existingFeatures.join(", ")}` : ""}
|
|
1998
2059
|
`;
|
|
1999
2060
|
if (competitors && competitors.length > 0) {
|
|
2000
2061
|
prompt += `
|
|
2001
|
-
## Competitor
|
|
2062
|
+
## Competitor Intelligence
|
|
2063
|
+
Use this data to identify opportunities and prioritize features that address market gaps.
|
|
2002
2064
|
${competitors.map((c) => `
|
|
2003
|
-
### ${c.name}
|
|
2065
|
+
### ${c.name}${c.url ? ` (${c.url})` : ""}
|
|
2004
2066
|
- Strengths: ${c.strengths.join(", ")}
|
|
2005
2067
|
- Weaknesses: ${c.weaknesses.join(", ")}
|
|
2006
|
-
-
|
|
2007
|
-
`).join("
|
|
2068
|
+
- Differentiators: ${c.differentiators.join(", ")}
|
|
2069
|
+
`).join("")}
|
|
2008
2070
|
`;
|
|
2009
2071
|
}
|
|
2010
2072
|
if (request.focusAreas && request.focusAreas.length > 0) {
|
|
2011
2073
|
prompt += `
|
|
2012
2074
|
## Focus Areas
|
|
2013
|
-
|
|
2075
|
+
Prioritize features related to: ${request.focusAreas.join(", ")}
|
|
2014
2076
|
`;
|
|
2015
2077
|
}
|
|
2016
2078
|
if (request.customPrompt) {
|
|
@@ -2020,55 +2082,75 @@ ${request.customPrompt}
|
|
|
2020
2082
|
`;
|
|
2021
2083
|
}
|
|
2022
2084
|
prompt += `
|
|
2023
|
-
##
|
|
2024
|
-
|
|
2085
|
+
## Workflow
|
|
2086
|
+
1. Analyze project goals and user needs
|
|
2087
|
+
2. Apply MoSCoW prioritization (must/should/could/wont)
|
|
2088
|
+
3. Assess complexity and impact for each feature
|
|
2089
|
+
4. Organize into logical phases with dependencies
|
|
2090
|
+
5. Generate structured roadmap output
|
|
2091
|
+
|
|
2092
|
+
## Standard Phases
|
|
2093
|
+
- Foundation: Core infrastructure and essential features
|
|
2094
|
+
- Enhancement: Improved UX and additional functionality
|
|
2095
|
+
- Scale: Performance, integrations, advanced features
|
|
2096
|
+
- Future: Long-term vision and nice-to-haves
|
|
2097
|
+
|
|
2098
|
+
## MoSCoW Framework
|
|
2099
|
+
- must: Critical for launch, blocks everything else
|
|
2100
|
+
- should: Important but not blocking
|
|
2101
|
+
- could: Nice to have, implement if time permits
|
|
2102
|
+
- wont: Out of scope for current planning horizon
|
|
2103
|
+
|
|
2104
|
+
## Priority Matrix
|
|
2105
|
+
- High Impact + Low Effort = Do First (must)
|
|
2106
|
+
- High Impact + High Effort = Plan Carefully (should)
|
|
2107
|
+
- Low Impact + Low Effort = Quick Wins (could)
|
|
2108
|
+
- Low Impact + High Effort = Deprioritize (wont)
|
|
2109
|
+
|
|
2110
|
+
## Required Output Schema
|
|
2111
|
+
Return ONLY valid JSON. Begin with { and end with }:
|
|
2025
2112
|
|
|
2026
|
-
Use the MoSCoW prioritization framework:
|
|
2027
|
-
- must: Critical features that must be implemented
|
|
2028
|
-
- should: Important features that should be implemented
|
|
2029
|
-
- could: Nice-to-have features that could be implemented
|
|
2030
|
-
- wont: Features that won't be implemented in the near term
|
|
2031
|
-
|
|
2032
|
-
For each feature, estimate:
|
|
2033
|
-
- effort: low, medium, or high
|
|
2034
|
-
- impact: low, medium, or high
|
|
2035
|
-
|
|
2036
|
-
Categories should be one of: functional, ui, bug, enhancement, testing, refactor
|
|
2037
|
-
|
|
2038
|
-
Return your roadmap as JSON:
|
|
2039
|
-
\`\`\`json
|
|
2040
2113
|
{
|
|
2041
|
-
"projectDescription": "
|
|
2042
|
-
"targetAudience": "
|
|
2114
|
+
"projectDescription": "Inferred project purpose and value proposition",
|
|
2115
|
+
"targetAudience": "Primary user persona",
|
|
2043
2116
|
"phases": [
|
|
2044
2117
|
{
|
|
2045
|
-
"name": "
|
|
2046
|
-
"description": "Core features for
|
|
2118
|
+
"name": "Foundation",
|
|
2119
|
+
"description": "Core features required for initial launch"
|
|
2047
2120
|
},
|
|
2048
2121
|
{
|
|
2049
|
-
"name": "
|
|
2122
|
+
"name": "Enhancement",
|
|
2050
2123
|
"description": "Features to improve user experience"
|
|
2124
|
+
},
|
|
2125
|
+
{
|
|
2126
|
+
"name": "Scale",
|
|
2127
|
+
"description": "Growth and advanced capabilities"
|
|
2051
2128
|
}
|
|
2052
2129
|
],
|
|
2053
2130
|
"features": [
|
|
2054
2131
|
{
|
|
2055
2132
|
"title": "Feature title",
|
|
2056
|
-
"description": "What this feature does",
|
|
2133
|
+
"description": "What this feature does and why users need it",
|
|
2057
2134
|
"priority": "must",
|
|
2058
2135
|
"category": "functional",
|
|
2059
2136
|
"effort": "medium",
|
|
2060
2137
|
"impact": "high",
|
|
2061
|
-
"phase": "
|
|
2062
|
-
"rationale": "Why this feature
|
|
2063
|
-
"steps": ["
|
|
2138
|
+
"phase": "Foundation",
|
|
2139
|
+
"rationale": "Why this feature matters - reference competitor gaps if applicable",
|
|
2140
|
+
"steps": ["Implementation step 1", "Implementation step 2"],
|
|
2141
|
+
"acceptanceCriteria": ["User can do X", "System handles Y"]
|
|
2064
2142
|
}
|
|
2065
2143
|
]
|
|
2066
2144
|
}
|
|
2067
|
-
\`\`\`
|
|
2068
2145
|
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2146
|
+
## Critical Requirements
|
|
2147
|
+
- Generate 10-20 features across 3-4 phases
|
|
2148
|
+
- Each feature must have clear acceptance criteria
|
|
2149
|
+
- Don't duplicate existing project features
|
|
2150
|
+
- Reference competitor insights in rationale where relevant
|
|
2151
|
+
- Be specific and actionable, not generic
|
|
2152
|
+
|
|
2153
|
+
Begin your response with { - no other text.`;
|
|
2072
2154
|
return prompt;
|
|
2073
2155
|
}
|
|
2074
2156
|
/**
|