popeye-cli 1.5.0 → 1.6.0

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.
Files changed (161) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/README.md +50 -8
  3. package/dist/cli/commands/create.d.ts.map +1 -1
  4. package/dist/cli/commands/create.js +54 -4
  5. package/dist/cli/commands/create.js.map +1 -1
  6. package/dist/cli/interactive.d.ts +29 -0
  7. package/dist/cli/interactive.d.ts.map +1 -1
  8. package/dist/cli/interactive.js +90 -7
  9. package/dist/cli/interactive.js.map +1 -1
  10. package/dist/generators/all.d.ts +4 -1
  11. package/dist/generators/all.d.ts.map +1 -1
  12. package/dist/generators/all.js +36 -316
  13. package/dist/generators/all.js.map +1 -1
  14. package/dist/generators/doc-parser.d.ts +18 -3
  15. package/dist/generators/doc-parser.d.ts.map +1 -1
  16. package/dist/generators/doc-parser.js +81 -10
  17. package/dist/generators/doc-parser.js.map +1 -1
  18. package/dist/generators/frontend-design-analyzer.d.ts +30 -0
  19. package/dist/generators/frontend-design-analyzer.d.ts.map +1 -0
  20. package/dist/generators/frontend-design-analyzer.js +208 -0
  21. package/dist/generators/frontend-design-analyzer.js.map +1 -0
  22. package/dist/generators/shared-packages.d.ts +45 -0
  23. package/dist/generators/shared-packages.d.ts.map +1 -0
  24. package/dist/generators/shared-packages.js +456 -0
  25. package/dist/generators/shared-packages.js.map +1 -0
  26. package/dist/generators/templates/index.d.ts +4 -0
  27. package/dist/generators/templates/index.d.ts.map +1 -1
  28. package/dist/generators/templates/index.js +4 -0
  29. package/dist/generators/templates/index.js.map +1 -1
  30. package/dist/generators/templates/website-components.d.ts.map +1 -1
  31. package/dist/generators/templates/website-components.js +36 -11
  32. package/dist/generators/templates/website-components.js.map +1 -1
  33. package/dist/generators/templates/website-config.d.ts +15 -1
  34. package/dist/generators/templates/website-config.d.ts.map +1 -1
  35. package/dist/generators/templates/website-config.js +155 -13
  36. package/dist/generators/templates/website-config.js.map +1 -1
  37. package/dist/generators/templates/website-landing.d.ts +24 -0
  38. package/dist/generators/templates/website-landing.d.ts.map +1 -0
  39. package/dist/generators/templates/website-landing.js +276 -0
  40. package/dist/generators/templates/website-landing.js.map +1 -0
  41. package/dist/generators/templates/website-layout.d.ts +42 -0
  42. package/dist/generators/templates/website-layout.d.ts.map +1 -0
  43. package/dist/generators/templates/website-layout.js +408 -0
  44. package/dist/generators/templates/website-layout.js.map +1 -0
  45. package/dist/generators/templates/website-pricing.d.ts +11 -0
  46. package/dist/generators/templates/website-pricing.d.ts.map +1 -0
  47. package/dist/generators/templates/website-pricing.js +313 -0
  48. package/dist/generators/templates/website-pricing.js.map +1 -0
  49. package/dist/generators/templates/website-sections.d.ts +102 -0
  50. package/dist/generators/templates/website-sections.d.ts.map +1 -0
  51. package/dist/generators/templates/website-sections.js +444 -0
  52. package/dist/generators/templates/website-sections.js.map +1 -0
  53. package/dist/generators/templates/website.d.ts +10 -50
  54. package/dist/generators/templates/website.d.ts.map +1 -1
  55. package/dist/generators/templates/website.js +12 -788
  56. package/dist/generators/templates/website.js.map +1 -1
  57. package/dist/generators/website-content-scanner.d.ts +37 -0
  58. package/dist/generators/website-content-scanner.d.ts.map +1 -0
  59. package/dist/generators/website-content-scanner.js +165 -0
  60. package/dist/generators/website-content-scanner.js.map +1 -0
  61. package/dist/generators/website-context.d.ts +38 -2
  62. package/dist/generators/website-context.d.ts.map +1 -1
  63. package/dist/generators/website-context.js +179 -19
  64. package/dist/generators/website-context.js.map +1 -1
  65. package/dist/generators/website-debug.d.ts +68 -0
  66. package/dist/generators/website-debug.d.ts.map +1 -0
  67. package/dist/generators/website-debug.js +93 -0
  68. package/dist/generators/website-debug.js.map +1 -0
  69. package/dist/generators/website.d.ts +2 -0
  70. package/dist/generators/website.d.ts.map +1 -1
  71. package/dist/generators/website.js +66 -4
  72. package/dist/generators/website.js.map +1 -1
  73. package/dist/generators/workspace-root.d.ts +27 -0
  74. package/dist/generators/workspace-root.d.ts.map +1 -0
  75. package/dist/generators/workspace-root.js +100 -0
  76. package/dist/generators/workspace-root.js.map +1 -0
  77. package/dist/state/index.d.ts +8 -0
  78. package/dist/state/index.d.ts.map +1 -1
  79. package/dist/state/index.js +10 -0
  80. package/dist/state/index.js.map +1 -1
  81. package/dist/types/workflow.d.ts +6 -0
  82. package/dist/types/workflow.d.ts.map +1 -1
  83. package/dist/types/workflow.js +2 -0
  84. package/dist/types/workflow.js.map +1 -1
  85. package/dist/upgrade/handlers.d.ts +15 -0
  86. package/dist/upgrade/handlers.d.ts.map +1 -1
  87. package/dist/upgrade/handlers.js +52 -0
  88. package/dist/upgrade/handlers.js.map +1 -1
  89. package/dist/workflow/auto-fix-bundler.d.ts +37 -0
  90. package/dist/workflow/auto-fix-bundler.d.ts.map +1 -0
  91. package/dist/workflow/auto-fix-bundler.js +320 -0
  92. package/dist/workflow/auto-fix-bundler.js.map +1 -0
  93. package/dist/workflow/auto-fix.d.ts.map +1 -1
  94. package/dist/workflow/auto-fix.js +10 -3
  95. package/dist/workflow/auto-fix.js.map +1 -1
  96. package/dist/workflow/index.d.ts +1 -0
  97. package/dist/workflow/index.d.ts.map +1 -1
  98. package/dist/workflow/index.js +12 -0
  99. package/dist/workflow/index.js.map +1 -1
  100. package/dist/workflow/overview.d.ts.map +1 -1
  101. package/dist/workflow/overview.js +4 -0
  102. package/dist/workflow/overview.js.map +1 -1
  103. package/dist/workflow/plan-mode.d.ts +4 -3
  104. package/dist/workflow/plan-mode.d.ts.map +1 -1
  105. package/dist/workflow/plan-mode.js +69 -5
  106. package/dist/workflow/plan-mode.js.map +1 -1
  107. package/dist/workflow/website-strategy.d.ts +9 -0
  108. package/dist/workflow/website-strategy.d.ts.map +1 -1
  109. package/dist/workflow/website-strategy.js +73 -1
  110. package/dist/workflow/website-strategy.js.map +1 -1
  111. package/dist/workflow/website-updater.d.ts.map +1 -1
  112. package/dist/workflow/website-updater.js +15 -4
  113. package/dist/workflow/website-updater.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/cli/commands/create.ts +58 -4
  116. package/src/cli/interactive.ts +96 -7
  117. package/src/generators/all.ts +44 -332
  118. package/src/generators/doc-parser.ts +87 -10
  119. package/src/generators/frontend-design-analyzer.ts +261 -0
  120. package/src/generators/shared-packages.ts +500 -0
  121. package/src/generators/templates/index.ts +4 -0
  122. package/src/generators/templates/website-components.ts +36 -11
  123. package/src/generators/templates/website-config.ts +166 -13
  124. package/src/generators/templates/website-landing.ts +331 -0
  125. package/src/generators/templates/website-layout.ts +443 -0
  126. package/src/generators/templates/website-pricing.ts +330 -0
  127. package/src/generators/templates/website-sections.ts +541 -0
  128. package/src/generators/templates/website.ts +38 -851
  129. package/src/generators/website-content-scanner.ts +208 -0
  130. package/src/generators/website-context.ts +248 -20
  131. package/src/generators/website-debug.ts +130 -0
  132. package/src/generators/website.ts +71 -3
  133. package/src/generators/workspace-root.ts +113 -0
  134. package/src/state/index.ts +14 -0
  135. package/src/types/workflow.ts +6 -0
  136. package/src/upgrade/handlers.ts +65 -0
  137. package/src/workflow/auto-fix-bundler.ts +392 -0
  138. package/src/workflow/auto-fix.ts +11 -3
  139. package/src/workflow/index.ts +12 -0
  140. package/src/workflow/overview.ts +6 -0
  141. package/src/workflow/plan-mode.ts +81 -7
  142. package/src/workflow/website-strategy.ts +75 -1
  143. package/src/workflow/website-updater.ts +17 -6
  144. package/tests/cli/project-naming.test.ts +136 -0
  145. package/tests/generators/doc-parser.test.ts +121 -0
  146. package/tests/generators/frontend-design-analyzer.test.ts +90 -0
  147. package/tests/generators/quality-gate.test.ts +183 -0
  148. package/tests/generators/shared-packages.test.ts +83 -0
  149. package/tests/generators/website-components.test.ts +1 -1
  150. package/tests/generators/website-config.test.ts +84 -0
  151. package/tests/generators/website-content-scanner.test.ts +181 -0
  152. package/tests/generators/website-context.test.ts +109 -0
  153. package/tests/generators/website-debug.test.ts +77 -0
  154. package/tests/generators/website-landing.test.ts +188 -0
  155. package/tests/generators/website-pricing.test.ts +98 -0
  156. package/tests/generators/website-sections.test.ts +245 -0
  157. package/tests/generators/workspace-root.test.ts +105 -0
  158. package/tests/upgrade/handlers.test.ts +162 -0
  159. package/tests/workflow/auto-fix-bundler.test.ts +242 -0
  160. package/tests/workflow/plan-mode.test.ts +111 -1
  161. package/tests/workflow/website-strategy.test.ts +55 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,60 @@
2
2
 
3
3
  All notable changes to Popeye CLI are documented in this file.
4
4
 
5
+ ## [1.6.0] - 2026-02-17
6
+
7
+ ### Added
8
+ - **Dual-Mode Website Validation** - `validateWebsiteContext()` (soft/non-throwing) and `validateWebsiteContextOrThrow()` (hard). All 4 website entry points now validate context quality (was 1 of 4). Returns `ValidationResult` with `passed`, `issues`, `warnings`, and `contentScore` (0-100).
9
+ - **Post-Generation Content Scanner** - `scanGeneratedContent()` scans generated `.tsx`/`.ts` files for placeholder fingerprints: TODO comments, default taglines, generic descriptions, default pricing tiers ($29/mo, Starter/Pro/Enterprise), default "How It Works" steps, lorem ipsum. Integrated into website generator (non-blocking warnings).
10
+ - **Workspace Root Detection** - `workspace-root.ts` detects monorepo roots via `.popeye/`, `package.json` workspaces, `pnpm-workspace.yaml`, `turbo.json`. Doc discovery and brand asset scanning now traverse workspace boundaries.
11
+ - **Shared Packages Module** - Extracted `generateDesignTokensPackage()` and `generateUiPackage()` from `all.ts` into `shared-packages.ts`. Brand-specific color scale generation (hex to HSL to 10-stop scale).
12
+ - **Frontend Design Analyzer** - `analyzeFrontendDesign()` extracts colors, fonts, and component library info from `apps/frontend/` CSS vars, Tailwind config, and package.json.
13
+ - **Bundler Error Auto-Fix** - `auto-fix-bundler.ts` handles CSS/PostCSS/Tailwind/webpack errors that the TypeScript-only parser misses. Discovers related config files, sends to Claude for fix.
14
+ - **CWD-Aware Project Naming** - `generateProjectName()` now checks docs first, then CWD basename, then idea text. Skips generic dir names (Projects, Desktop, tmp).
15
+ - **Project Brief Generation** - `generateProjectBrief()` creates `PROJECT_BRIEF.md` in `.popeye/` with product name, tagline, color, and source doc paths.
16
+ - **`[WEB]` App Tag Support** - Plan parser recognizes `[WEB]` tags on tasks, maps to `website` app target, counted in `webTasks` stat.
17
+ - **Website Debug Tracing** - `POPEYE_DEBUG_WEBSITE=1` env var enables detailed pipeline trace showing doc discovery, brand assets, template values, and validation results.
18
+ - **Strategy Context Packing** - `packProductContext()` with priority-based doc packing (spec > pricing > brand > features) and 16K budget.
19
+ - `skipValidation` option on `WebsiteGeneratorOptions` as escape hatch for scaffold-only use.
20
+ - `sourceDocPaths` field on `ProjectState` for doc awareness across sessions.
21
+ - `strategyError` field on `ProjectState` for strategy failure visibility.
22
+
23
+ ### Fixed
24
+ - **Critical**: Website generation pipeline produced generic/broken output (TODO placeholders, wrong product names, default $29/mo pricing). Root cause: validation existed but was bypassed by 3 of 4 entry points. Now all entry points validate.
25
+ - **Critical**: Upgrade pipeline (`/upgrade fullstack -> all`) generated website with TODO placeholders. `buildUpgradeContentContext()` now builds full content context from user docs, brand assets, and strategy.
26
+ - **Critical**: `extractProductName()` returned directory names instead of product names. Now uses 5-step priority chain (docs heading > spec heading > spec label > package.json > undefined).
27
+ - **Critical**: `extractPricing()` matched design doc sections ("Plan-Based Color Usage") as pricing tiers. Now uses strict price validation and `Pricing` keyword only.
28
+ - `readProjectDocs` maxLength increased from 6K to 25K with per-file 8K cap. Brand/color docs sorted first to prevent truncation.
29
+ - `extractFeatures()` removed `enforce` keyword (matched "Enforcement Colors" in design docs), tightened `feature` to require plural or prefix.
30
+ - `extractTagline()` now prefers tagline from heading matching product name exactly (avoids wrong doc in multi-doc concatenation).
31
+ - `extractDescription()` prefers "What Is [Product]?" over generic "What is a [thing]?" sections.
32
+ - Logo copy path mismatch: `public/logo{ext}` corrected to `public/brand/logo{ext}` per `BrandAssetsContract`.
33
+ - Logo path in Header component: strips `public/` prefix for Next.js serving.
34
+ - Auto-fix false success: first attempt with zero parsed errors now returns `success: false` instead of `success: true`.
35
+ - `parseTypeScriptErrors` now supports both tsc and bundler output formats, strips ANSI codes, deduplicates.
36
+ - Plan parser: `[FE]`/`[BE]`/`[WEB]`/`[INT]` tags no longer block task name extraction by `isActionableTask()`.
37
+ - Tailwind config: brand color scale generated from hex instead of defaulting to sky-blue.
38
+
39
+ ### Changed
40
+ - `validateWebsiteContextOrThrow()` now delegates to `validateWebsiteContext()` internally.
41
+ - `all.ts` website context building: validates with soft mode, logs warnings without blocking.
42
+ - `website-updater.ts`: reports quality issues via `onProgress` callback.
43
+ - `upgrade/handlers.ts`: `buildUpgradeContentContext()` includes validation warnings in return value.
44
+ - Website template files split into focused modules: `website-landing.ts`, `website-pricing.ts`, `website-layout.ts`, `website-sections.ts`.
45
+
46
+ ## [1.5.0] - 2026-02-13
47
+
48
+ ### Added
49
+ - **Strategy-First Website Generation** - AI-powered marketing strategy generation with ICP analysis, positioning, messaging, SEO strategy, site architecture, conversion strategy, and competitive context.
50
+ - **Reviewer Persona Switching** - `reviewerPersona` field in ConsensusConfig for marketing-specific consensus review.
51
+ - **Website Components** - Header (logo/text fallback, nav, CTA, mobile menu), Footer (multi-column, brand), Navigation config.
52
+ - **SEO Infrastructure** - JsonLd component, enhanced sitemap/robots, 404/500 error pages, web manifest, meta helper.
53
+ - **Lead Capture System** - API route with webhook/resend/postmark support, contact form, env examples.
54
+ - **Brand Assets Contract** - `BrandAssetsContract` interface and `resolveBrandAssets()` for deterministic logo/favicon placement.
55
+ - **Website Strategy Caching** - SHA-256 hash-based staleness detection, store/load with metadata.
56
+ - `'website-strategy'` workflow stage.
57
+ - `websiteStrategy` and `storeWebsiteStrategyPath()` in project state.
58
+
5
59
  ## [1.4.0] - 2026-02-08
6
60
 
7
61
  ### Added
package/README.md CHANGED
@@ -18,12 +18,14 @@ Popeye is an autonomous software development agent that takes a simple project i
18
18
  1. **Understands** your idea and expands it into a detailed specification
19
19
  2. **Designs** the UI automatically based on the project context
20
20
  3. **Strategizes** (website projects) by generating a marketing strategy with ICP, positioning, SEO, and conversion goals
21
- 4. **Plans** a complete development roadmap with milestones and tasks
22
- 5. **Validates** the plan through AI consensus (multiple AI systems must agree)
23
- 6. **Implements** each task autonomously, writing production-quality code
24
- 7. **Styles** the application with a professional design system and component library
25
- 8. **Tests** the implementation and fixes issues automatically
26
- 9. **Delivers** a complete, working project with polished UI
21
+ 4. **Validates context** (website projects) by checking content quality before generation and warning about missing docs, default pricing, or placeholder content
22
+ 5. **Plans** a complete development roadmap with milestones and tasks
23
+ 6. **Validates** the plan through AI consensus (multiple AI systems must agree)
24
+ 7. **Implements** each task autonomously, writing production-quality code
25
+ 8. **Scans** generated website files for placeholder fingerprints (TODO comments, lorem ipsum, default tiers) and reports quality warnings
26
+ 9. **Styles** the application with a professional design system and component library
27
+ 10. **Tests** the implementation and fixes issues automatically
28
+ 11. **Delivers** a complete, working project with polished UI
27
29
 
28
30
  ## How It Works
29
31
 
@@ -360,6 +362,8 @@ Popeye provides real-time feedback:
360
362
  [Website Strategy] Generating website strategy via AI...
361
363
  [Website Strategy] Validating strategy schema...
362
364
  [Website Strategy] Strategy cached to .popeye/website-strategy.json
365
+ [Validation] Website context score: 85/100
366
+ [Validation] Warning: No tagline extracted from docs. Footer and meta tags will use generic defaults.
363
367
  [Consensus] Review round 1: 78% agreement (Marketing Strategist persona)
364
368
  [Consensus] Addressing concerns...
365
369
  [Consensus] Review round 2: 92% agreement
@@ -373,10 +377,12 @@ Popeye provides real-time feedback:
373
377
  [UI Setup] Installing UI component dependencies...
374
378
  [UI Setup] Setting up theme and styles...
375
379
  [UI Setup] UI setup complete: 5 components installed
380
+ [Content Scan] Scanned 14 files, score: 95/100
381
+ [Content Scan] Warning: src/app/pricing/page.tsx - Default pricing amount ($29/mo)
376
382
  [Complete] Project built successfully!
377
383
  ```
378
384
 
379
- **Note:** The `[Website Strategy]` steps appear only for `website` and `all` project types. The marketing strategist persona for consensus review is also specific to website projects.
385
+ **Note:** The `[Website Strategy]`, `[Validation]`, and `[Content Scan]` steps appear only for `website` and `all` project types. The marketing strategist persona for consensus review is also specific to website projects. Validation warnings are informational and do not block generation (except in direct `website.ts` generation, where blocking issues cause an error).
380
386
 
381
387
  ## Features
382
388
 
@@ -477,6 +483,41 @@ Popeye automatically discovers brand assets (logos, favicons, color schemes) fro
477
483
  - Primary brand color is extracted from design docs or CSS variables
478
484
  - The `BrandAssetsContract` interface ensures consistent logo placement across Header, manifest, and metadata
479
485
 
486
+ #### Dual-Mode Website Context Validation
487
+
488
+ Website generation includes a two-layer quality system that prevents generic, placeholder-filled websites:
489
+
490
+ **Pre-Generation Validation** checks the content context before any code is written. It operates in two modes:
491
+
492
+ | Mode | Function | Behavior | Used By |
493
+ |------|----------|----------|---------|
494
+ | **Hard (throwing)** | `validateWebsiteContextOrThrow()` | Throws an error and blocks generation | `website.ts` (direct generation) |
495
+ | **Soft (non-throwing)** | `validateWebsiteContext()` | Returns `ValidationResult` with issues/warnings, logs but does not block | `all.ts`, `website-updater.ts`, `upgrade/handlers.ts` |
496
+
497
+ The `ValidationResult` includes:
498
+ - `passed` -- whether the context has no blocking issues
499
+ - `issues` -- blocking problems (suspicious product name, missing docs, no features, missing strategy)
500
+ - `warnings` -- non-blocking concerns (default pricing tiers, missing tagline/description/brand color)
501
+ - `contentScore` -- 0-100 quality score, deducted for each default or missing piece
502
+
503
+ Checks include: suspicious product name detection (e.g., `my-app`), missing documentation, zero features extracted, missing strategy, brand/color doc parsing failures, default pricing fingerprint detection (Starter/Pro/Enterprise at $0/$29/Custom), and missing tagline/description/brand color.
504
+
505
+ **Post-Generation Content Scanner** (`website-content-scanner.ts`) scans the generated `.tsx`/`.ts` files for known placeholder fingerprints after code has been written:
506
+
507
+ | Pattern | Severity | Description |
508
+ |---------|----------|-------------|
509
+ | TODO comments | error | `// TODO`, `/* TODO */`, `{/* TODO */}` |
510
+ | Lorem ipsum | error | Placeholder text left in templates |
511
+ | Default tagline | warning | "Build something amazing" |
512
+ | Generic description | warning | "Your modern web application" |
513
+ | Default pricing | warning | `$29/mo` amounts in generated files |
514
+ | Default pricing tiers | warning | Starter/Pro/Enterprise tier names together |
515
+ | Default How It Works | warning | Sign Up/Configure/Deploy steps together |
516
+
517
+ The scanner returns a `ScanResult` with all issues, the number of files scanned, and a 0-100 quality score. Issues are logged as warnings so developers can review and fix placeholder content.
518
+
519
+ Both layers work together: pre-generation validation catches missing inputs, while post-generation scanning catches placeholder content that slipped through into the generated code. The `skipValidation` option in `generateWebsiteProject()` provides an escape hatch for edge cases.
520
+
480
521
  #### Reviewer Persona Switching
481
522
 
482
523
  For website projects, the consensus reviewer automatically switches to a **Senior Product Marketing Strategist** persona instead of the default technical reviewer. This ensures the plan is evaluated for marketing effectiveness, conversion optimization, and SEO quality rather than purely technical criteria. The `reviewerPersona` field in `ConsensusConfig` controls this behavior and is threaded through all adapter implementations (OpenAI, Gemini, Grok).
@@ -1303,7 +1344,8 @@ src/
1303
1344
  │ ├── typescript.ts # TypeScript scaffolding
1304
1345
  │ ├── fullstack.ts # Fullstack scaffolding (React + FastAPI)
1305
1346
  │ ├── website.ts # Website scaffolding (Next.js, strategy-aware)
1306
- │ ├── website-context.ts # Doc discovery, brand assets, content context builder
1347
+ │ ├── website-context.ts # Doc discovery, brand assets, content context, dual-mode validation
1348
+ │ ├── website-content-scanner.ts # Post-generation placeholder fingerprint scanner
1307
1349
  │ ├── doc-parser.ts # Product doc parsing (name, tagline, features, pricing, color)
1308
1350
  │ ├── all.ts # ALL project scaffolding (exports 5 generator functions)
1309
1351
  │ └── templates/ # File templates
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAgO7C"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAgO7C"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { Command } from 'commander';
6
6
  import path from 'node:path';
7
+ import { promises as fs } from 'node:fs';
7
8
  import { ProjectSpecSchema } from '../../types/project.js';
8
9
  import { requireAuth } from '../../auth/index.js';
9
10
  import { runWorkflow } from '../../workflow/index.js';
@@ -58,8 +59,8 @@ export function createCreateCommand() {
58
59
  process.exit(1);
59
60
  }
60
61
  // Generate project name from idea if not provided
61
- const projectName = options.name || generateProjectName(idea);
62
62
  const outputDir = path.resolve(options.output);
63
+ const projectName = options.name || await generateProjectName(idea, outputDir);
63
64
  const projectDir = path.join(outputDir, projectName);
64
65
  const threshold = parseInt(options.threshold, 10);
65
66
  const maxIterations = parseInt(options.maxIterations, 10);
@@ -188,10 +189,59 @@ export function createCreateCommand() {
188
189
  return create;
189
190
  }
190
191
  /**
191
- * Generate a project name from an idea
192
+ * Directories that are too generic to use as project names
192
193
  */
193
- function generateProjectName(idea) {
194
- // Take first few words, lowercase, replace spaces with hyphens
194
+ const GENERIC_DIR_NAMES = new Set([
195
+ 'home', 'desktop', 'documents', 'downloads', 'projects', 'project',
196
+ 'repos', 'code', 'dev', 'workspace', 'workspaces', 'src', 'tmp',
197
+ 'temp', 'users', 'user', 'root', 'var', 'opt',
198
+ ]);
199
+ /**
200
+ * Generate a project name, preferring CWD-derived names over prompt text.
201
+ *
202
+ * Priority: docs in CWD -> CWD basename -> idea text extraction
203
+ *
204
+ * @param idea - The user's project idea text
205
+ * @param cwd - Optional directory for context-aware naming
206
+ * @returns A kebab-case project name
207
+ */
208
+ async function generateProjectName(idea, cwd) {
209
+ const toKebab = (name) => name
210
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
211
+ .toLowerCase()
212
+ .replace(/[^a-z0-9-]/g, '-')
213
+ .replace(/-+/g, '-')
214
+ .replace(/^-|-$/g, '');
215
+ if (cwd) {
216
+ // Check for doc-derived name
217
+ try {
218
+ const entries = await fs.readdir(cwd, { withFileTypes: true });
219
+ const mdFiles = entries
220
+ .filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.toLowerCase().startsWith('readme'))
221
+ .map(e => path.join(cwd, e.name));
222
+ for (const mdFile of mdFiles) {
223
+ try {
224
+ const content = await fs.readFile(mdFile, 'utf-8');
225
+ const headingMatch = content.match(/^#\s+([A-Z][a-zA-Z0-9]+)/m);
226
+ if (headingMatch && headingMatch[1] && headingMatch[1].length >= 3 && headingMatch[1].length <= 30) {
227
+ return toKebab(headingMatch[1]);
228
+ }
229
+ }
230
+ catch {
231
+ // Skip unreadable files
232
+ }
233
+ }
234
+ }
235
+ catch {
236
+ // Directory not readable
237
+ }
238
+ // Check CWD basename
239
+ const dirName = path.basename(cwd);
240
+ if (dirName.length >= 3 && !GENERIC_DIR_NAMES.has(dirName.toLowerCase())) {
241
+ return toKebab(dirName);
242
+ }
243
+ }
244
+ // Fallback: extract from idea text
195
245
  return idea
196
246
  .toLowerCase()
197
247
  .replace(/[^a-z0-9\s]/g, '')
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/cli/commands/create.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAyC,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;SACjC,WAAW,CAAC,mCAAmC,CAAC;SAChD,QAAQ,CAAC,QAAQ,EAAE,6BAA6B,CAAC;SACjD,MAAM,CAAC,mBAAmB,EAAE,cAAc,CAAC;SAC3C,MAAM,CACL,uBAAuB,EACvB,4EAA4E,EAC5E,QAAQ,CACT;SACA,MAAM,CACL,qBAAqB,EACrB,8DAA8D,EAC9D,QAAQ,CACT;SACA,MAAM,CACL,oBAAoB,EACpB,kBAAkB,EAClB,OAAO,CAAC,GAAG,EAAE,CACd;SACA,MAAM,CACL,uBAAuB,EACvB,gCAAgC,EAChC,IAAI,CACL;SACA,MAAM,CACL,0BAA0B,EAC1B,8BAA8B,EAC9B,GAAG,CACJ;SACA,MAAM,CACL,iBAAiB,EACjB,kCAAkC,CACnC;SACA,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC;YACH,oCAAoC;YACpC,MAAM,WAAW,GAAmC;gBAClD,kBAAkB;gBAClB,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,QAAQ;gBAClB,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,QAAQ;gBACnB,mBAAmB;gBACnB,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,YAAY;gBAC1B,IAAI,EAAE,YAAY;gBAClB,UAAU,EAAE,YAAY;gBACxB,oBAAoB;gBACpB,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,WAAW;gBACxB,kBAAkB;gBAClB,KAAK,EAAE,SAAS;gBAChB,SAAS,EAAE,SAAS;gBACpB,cAAc;gBACd,KAAK,EAAE,KAAK;aACb,CAAC;YACF,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,UAAU,CAAC,qBAAqB,OAAO,CAAC,QAAQ,0CAA0C,CAAC,CAAC;gBAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAoB,CAAC;YAC3C,MAAM,WAAW,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YACtF,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACjC,UAAU,CAAC,kBAAkB,KAAK,iBAAiB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,kDAAkD;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAClD,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAE1D,wBAAwB;YACxB,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC;gBAC7C,IAAI;gBACJ,IAAI,EAAE,WAAW;gBACjB,QAAQ;gBACR,WAAW,EAAE,KAAK;gBAClB,SAAS;aACV,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,UAAU,CAAC,kCAAkC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;YAE7B,eAAe;YACf,WAAW,CAAC,+BAA+B,CAAC,CAAC;YAE7C,YAAY,CAAC,uBAAuB,CAAC,CAAC;YACtC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACnC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YACpC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9B,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACpC,aAAa,CAAC,WAAW,EAAE,GAAG,SAAS,GAAG,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,4BAA4B;YAC5B,IAAI,MAAM,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;gBACvC,YAAY,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;gBACxD,SAAS,CAAC,0CAA0C,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,yBAAyB;YACzB,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAC/B,YAAY,CAAC,4BAA4B,CAAC,CAAC;YAE3C,IAAI,CAAC;gBACH,MAAM,WAAW,EAAE,CAAC;gBACpB,cAAc,CAAC,yBAAyB,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,WAAW,CAAC,yBAAyB,CAAC,CAAC;gBACvC,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,4BAA4B;YAC5B,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;gBAC1B,YAAY,CAAC,qBAAqB,CAAC,CAAC;gBACpC,YAAY,CAAC,+BAA+B,CAAC,CAAC;gBAE9C,MAAM,cAAc,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAE9D,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;oBAC5B,WAAW,CAAC,oBAAoB,CAAC,CAAC;oBAClC,UAAU,CAAC,cAAc,CAAC,KAAK,IAAI,oCAAoC,CAAC,CAAC;oBACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,cAAc,CAAC,WAAW,cAAc,CAAC,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAC;YACxE,CAAC;YAED,mBAAmB;YACnB,YAAY,CAAC,oBAAoB,CAAC,CAAC;YAEnC,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE;gBAC7C,UAAU;gBACV,eAAe,EAAE;oBACf,SAAS;oBACT,aAAa;oBACb,WAAW,EAAE,KAAK;iBACnB;gBACD,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;oBAC7B,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACvC,CAAC;aACF,CAAC,CAAC;YAEH,2BAA2B;YAC3B,WAAW,EAAE,CAAC;YAEd,gBAAgB;YAChB,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;gBAC3B,WAAW,CAAC,+BAA+B,CAAC,CAAC;gBAE7C,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;gBACtC,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAEpC,IAAI,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC;oBAC/C,aAAa,CAAC,iBAAiB,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,GAAG,CAAC,CAAC;oBAC7F,aAAa,CAAC,YAAY,EAAE,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACpG,CAAC;gBAED,IAAI,cAAc,CAAC,eAAe,EAAE,CAAC;oBACnC,aAAa,CAAC,iBAAiB,EAAE,cAAc,CAAC,eAAe,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7F,CAAC;gBAED,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,YAAY,CAAC,wBAAwB,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,SAAS,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;gBAC9B,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAC1B,SAAS,CAAC,yBAAyB,CAAC,CAAC;gBACvC,CAAC;qBAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;oBACrC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACxB,CAAC;qBAAM,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;oBACpC,SAAS,CAAC,oDAAoD,CAAC,CAAC;oBAChE,SAAS,CAAC,sBAAsB,CAAC,CAAC;oBAClC,SAAS,CAAC,gDAAgD,CAAC,CAAC;oBAC5D,SAAS,CAAC,8EAA8E,CAAC,CAAC;gBAC5F,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,yBAAyB,CAAC,CAAC;gBAEvC,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;oBACzB,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC;gBAED,IAAI,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,CAAC;oBAC/C,YAAY,CAAC,kBAAkB,CAAC,CAAC;oBACjC,oBAAoB,CAClB,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAClD,cAAc,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAChE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,CAC1E,CAAC;gBACJ,CAAC;gBAED,qBAAqB;gBACrB,YAAY,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;gBAEjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS;IAClE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK;IAC/D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAC9C,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,GAAY;IAC3D,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CACvC,IAAI;SACD,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE3B,IAAI,GAAG,EAAE,CAAC;QACR,6BAA6B;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM,OAAO,GAAG,OAAO;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;iBAC/F,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;oBACnD,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;oBAChE,IAAI,YAAY,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;wBACnG,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,wBAAwB;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACzE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,KAAK,CAAC,KAAK,CAAC;SACZ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,IAAI,CAAC,GAAG,CAAC;SACT,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,IAAI,cAAc,GAA2C,IAAI,CAAC;AAClE,IAAI,SAAS,GAAG,EAAE,CAAC;AAEnB,SAAS,oBAAoB,CAAC,KAAa,EAAE,OAAe;IAC1D,oCAAoC;IACpC,MAAM,UAAU,GAA2B;QACzC,WAAW,EAAE,cAAc;QAC3B,aAAa,EAAE,gBAAgB;QAC/B,aAAa,EAAE,mBAAmB;QAClC,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,kBAAkB;QAC/B,iBAAiB,EAAE,oBAAoB;QACvC,YAAY,EAAE,gBAAgB;QAC9B,eAAe,EAAE,eAAe;QAChC,aAAa,EAAE,aAAa;QAC5B,oBAAoB,EAAE,oBAAoB;QAC1C,UAAU,EAAE,UAAU;QACtB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,OAAO;QAChB,UAAU,EAAE,UAAU;KACvB,CAAC;IAEF,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAE7C,2BAA2B;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5C,WAAW,EAAE,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,cAAc,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QAED,IAAI,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACrF,cAAc,GAAG,YAAY,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,aAAa,CAAC,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,yBAAyB;IACzB,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,OAAO,CAAC,CAAC;YACxB,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACnD,IAAI,cAAc,EAAE,CAAC;YACnB,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,cAAc,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;SAAM,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QACrC,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;SAAM,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,UAAU,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -2,6 +2,35 @@
2
2
  * Interactive mode
3
3
  * Claude Code-style interface for Popeye CLI
4
4
  */
5
+ /**
6
+ * Try to extract a product name from .md files in a directory.
7
+ * Looks for top-level headings (# ProductName) in markdown files.
8
+ *
9
+ * @param dir - Directory to scan for .md files
10
+ * @returns Product name if found, null otherwise
11
+ */
12
+ export declare function extractNameFromDocs(dir: string): Promise<string | null>;
13
+ /**
14
+ * Generate a meaningful project name from an idea, with CWD-aware logic.
15
+ *
16
+ * Priority chain:
17
+ * 1. If CWD contains .md docs with a "# ProductName" heading, use that
18
+ * 2. If CWD basename is a meaningful name (not generic), use it
19
+ * 3. Fall back to extracting a name from the idea text
20
+ *
21
+ * @param idea - The user's project idea text
22
+ * @param cwd - Optional current working directory for context-aware naming
23
+ * @returns A kebab-case project name
24
+ */
25
+ export declare function generateProjectName(idea: string, cwd?: string): Promise<string>;
26
+ /**
27
+ * Extract a project name from the idea text alone.
28
+ * This is the original generateProjectName logic, used as a fallback.
29
+ *
30
+ * @param idea - The user's project idea text
31
+ * @returns A kebab-case project name
32
+ */
33
+ export declare function generateProjectNameFromIdea(idea: string): string;
5
34
  /**
6
35
  * Start interactive mode with auto-authentication
7
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqnFH;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E1D"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/cli/interactive.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8tEH;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2B7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BrF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4EhE;AAiVD;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4E1D"}
@@ -1909,10 +1909,93 @@ async function handleResume(state, args) {
1909
1909
  }
1910
1910
  }
1911
1911
  /**
1912
- * Generate a meaningful project name from an idea
1913
- * Extracts key nouns and creates a kebab-case name
1912
+ * Directories that are too generic to use as project names.
1913
+ * If the CWD basename matches one of these, we skip CWD-based naming.
1914
1914
  */
1915
- function generateProjectName(idea) {
1915
+ const GENERIC_DIR_NAMES = new Set([
1916
+ 'home', 'desktop', 'documents', 'downloads', 'projects', 'project',
1917
+ 'repos', 'code', 'dev', 'workspace', 'workspaces', 'src', 'tmp',
1918
+ 'temp', 'users', 'user', 'root', 'var', 'opt',
1919
+ ]);
1920
+ /**
1921
+ * Try to extract a product name from .md files in a directory.
1922
+ * Looks for top-level headings (# ProductName) in markdown files.
1923
+ *
1924
+ * @param dir - Directory to scan for .md files
1925
+ * @returns Product name if found, null otherwise
1926
+ */
1927
+ export async function extractNameFromDocs(dir) {
1928
+ try {
1929
+ const entries = await fs.readdir(dir, { withFileTypes: true });
1930
+ const mdFiles = entries
1931
+ .filter(e => e.isFile() && e.name.endsWith('.md') && !e.name.toLowerCase().startsWith('readme'))
1932
+ .map(e => path.join(dir, e.name));
1933
+ for (const mdFile of mdFiles) {
1934
+ try {
1935
+ const content = await fs.readFile(mdFile, 'utf-8');
1936
+ // Look for a top-level heading like "# Gateco" or "# Gateco - Subtitle"
1937
+ const headingMatch = content.match(/^#\s+([A-Z][a-zA-Z0-9]+)/m);
1938
+ if (headingMatch && headingMatch[1]) {
1939
+ const name = headingMatch[1];
1940
+ // Validate: must be a reasonable product name (3-30 chars, not a generic word)
1941
+ if (name.length >= 3 && name.length <= 30 && !GENERIC_DIR_NAMES.has(name.toLowerCase())) {
1942
+ return name;
1943
+ }
1944
+ }
1945
+ }
1946
+ catch {
1947
+ // Skip unreadable files
1948
+ }
1949
+ }
1950
+ }
1951
+ catch {
1952
+ // Directory not readable
1953
+ }
1954
+ return null;
1955
+ }
1956
+ /**
1957
+ * Generate a meaningful project name from an idea, with CWD-aware logic.
1958
+ *
1959
+ * Priority chain:
1960
+ * 1. If CWD contains .md docs with a "# ProductName" heading, use that
1961
+ * 2. If CWD basename is a meaningful name (not generic), use it
1962
+ * 3. Fall back to extracting a name from the idea text
1963
+ *
1964
+ * @param idea - The user's project idea text
1965
+ * @param cwd - Optional current working directory for context-aware naming
1966
+ * @returns A kebab-case project name
1967
+ */
1968
+ export async function generateProjectName(idea, cwd) {
1969
+ // Normalize to kebab-case helper
1970
+ const toKebab = (name) => name
1971
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
1972
+ .toLowerCase()
1973
+ .replace(/[^a-z0-9-]/g, '-')
1974
+ .replace(/-+/g, '-')
1975
+ .replace(/^-|-$/g, '');
1976
+ if (cwd) {
1977
+ // Priority 1: Check for doc-derived name in CWD
1978
+ const docName = await extractNameFromDocs(cwd);
1979
+ if (docName) {
1980
+ return toKebab(docName);
1981
+ }
1982
+ // Priority 2: Use CWD basename if it's meaningful
1983
+ const dirName = path.basename(cwd);
1984
+ if (dirName.length >= 3 && !GENERIC_DIR_NAMES.has(dirName.toLowerCase())) {
1985
+ return toKebab(dirName);
1986
+ }
1987
+ }
1988
+ // Priority 3: Extract from idea text (original logic)
1989
+ return generateProjectNameFromIdea(idea);
1990
+ }
1991
+ /**
1992
+ * Extract a project name from the idea text alone.
1993
+ * This is the original generateProjectName logic, used as a fallback.
1994
+ *
1995
+ * @param idea - The user's project idea text
1996
+ * @returns A kebab-case project name
1997
+ */
1998
+ export function generateProjectNameFromIdea(idea) {
1916
1999
  // 1. First, try to find explicit project name patterns
1917
2000
  const explicitPatterns = [
1918
2001
  /(?:called|named|for|planning|project)\s+["']?([A-Z][a-zA-Z0-9]+)["']?/i,
@@ -2080,8 +2163,8 @@ async function handleIdea(idea, state) {
2080
2163
  return;
2081
2164
  }
2082
2165
  }
2083
- // Generate a meaningful project name
2084
- const projectName = generateProjectName(idea);
2166
+ // Generate a meaningful project name (CWD-aware: checks docs and dir name first)
2167
+ const projectName = await generateProjectName(idea, cwd);
2085
2168
  const projectDir = path.join(cwd, projectName);
2086
2169
  console.log();
2087
2170
  console.log(theme.primary.bold(' Creating Project'));
@@ -2183,8 +2266,8 @@ async function handleNewProject(idea, state) {
2183
2266
  }
2184
2267
  }
2185
2268
  const cwd = state.projectDir || process.cwd();
2186
- // Generate a meaningful project name
2187
- const projectName = generateProjectName(idea);
2269
+ // Generate a meaningful project name (CWD-aware: checks docs and dir name first)
2270
+ const projectName = await generateProjectName(idea, cwd);
2188
2271
  const projectDir = path.join(cwd, projectName);
2189
2272
  console.log();
2190
2273
  console.log(theme.primary.bold(' Creating New Project'));