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 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 = pkg.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 readmePaths = ["README.md", "readme.md", "README.txt", "readme.txt"];
1862
- for (const readmePath of readmePaths) {
1863
- const fullPath = join5(this.projectPath, readmePath);
1864
- if (existsSync3(fullPath)) {
1865
- const readme = readFileSync5(fullPath, "utf-8");
1866
- if (!description) {
1867
- const lines = readme.split("\n").filter((l) => l.trim() && !l.startsWith("#"));
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 product research analyst. Research competitors for the following project:
1960
-
1961
- Project: ${projectInfo.name}
1962
- Description: ${projectInfo.description}
1963
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
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
- Only return the JSON, no other text.`;
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 product strategist creating a feature roadmap for a software project.
1990
-
1991
- ## Project Information
1992
- Name: ${projectInfo.name}
1993
- Description: ${projectInfo.description}
1994
- Tech Stack: ${projectInfo.stack.join(", ") || "Unknown"}
1995
- ${projectInfo.existingFeatures.length > 0 ? `
1996
- Existing Features/Tasks:
1997
- ${projectInfo.existingFeatures.map((f) => `- ${f}`).join("\n")}` : ""}
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 Analysis
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
- - Key Features: ${c.differentiators.join(", ")}
2007
- `).join("\n")}
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
- The user wants to focus on: ${request.focusAreas.join(", ")}
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
- ## Your Task
2024
- Create a comprehensive product roadmap with features organized into phases.
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": "Brief description of the project",
2042
- "targetAudience": "Who this project is for",
2114
+ "projectDescription": "Inferred project purpose and value proposition",
2115
+ "targetAudience": "Primary user persona",
2043
2116
  "phases": [
2044
2117
  {
2045
- "name": "Phase 1: MVP",
2046
- "description": "Core features for minimum viable product"
2118
+ "name": "Foundation",
2119
+ "description": "Core features required for initial launch"
2047
2120
  },
2048
2121
  {
2049
- "name": "Phase 2: Enhancement",
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": "Phase 1: MVP",
2062
- "rationale": "Why this feature is important",
2063
- "steps": ["Step 1", "Step 2"]
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
- Generate 10-20 strategic features across 3-4 phases. Be specific and actionable.
2070
- Don't duplicate features that already exist in the project.
2071
- Only return the JSON, no other text.`;
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
  /**